【发布时间】:2017-03-15 20:47:49
【问题描述】:
例如,您制作了跟踪文件的可靠副本。比您对跟踪版本进行一些更改。比我想找到最接近,甚至可能等于我在存储库中复制文件的未跟踪版本的提交。有可能吗?
我知道最好的方法是让文件/存储库的副本包含它自己的 git 历史记录。但在这种情况下是不可能的。
对于信息,可以有相同的工作树和文件名。
【问题讨论】:
标签: git file search version diff
例如,您制作了跟踪文件的可靠副本。比您对跟踪版本进行一些更改。比我想找到最接近,甚至可能等于我在存储库中复制文件的未跟踪版本的提交。有可能吗?
我知道最好的方法是让文件/存储库的副本包含它自己的 git 历史记录。但在这种情况下是不可能的。
对于信息,可以有相同的工作树和文件名。
【问题讨论】:
标签: git file search version diff
我自己找到了一些可选的解决方案,我不会说这是我将使用的解决方案,或者它是我拥有的最好的解决方案,但我想在这里分享以防万一。
它被称为“关键字扩展”,它所做的只是在文件检出时触发一个脚本。该脚本名为“smudge”,您可以定义它会做什么,例如将文件的最后 10 次提交注入到标题中。 还有第二个脚本叫做“clean”,你确保它会反转“smudge”,所以 git 知道他必须在 diff 中忽略文件的哪一部分。
是的,由于“clean”,您将不会在遥控器上进行更改,但是每当您签出文件时,脚本都会对文件进行编辑,这样您就可以拥有修改后的部分.
从这里它给了我一些文件的痕迹,以及我不使用 git 时的历史记录。
这里是链接: https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Keyword-Expansion
【讨论】:
找到最接近的提交可能并非易事,因为它涉及以某种方式测量您的文件与您要比较的提交之间的相似性。
但是,如果您的副本与某个提交中的文件完全相同,则查看文件的提交历史并与您的副本进行比较并不难。如果您从 Git 存储库文件夹中运行类似以下 Bash 脚本(未测试)的内容,例如:
./compare.sh folder/subfolder/file.c ~/backup/copy-of-file.c
脚本:
#!/bin/bash
TRACKED="$1"
UNTRACKED="$2"
for commit in `git log --format=%H "$1"`; do
contents="$(git show $commit:"$TRACKED")"
diff "$UNTRACKED" <(echo "$contents") > /dev/null
if [ "$?" == 0 ]; then
echo "$UNTRACKED is the same as commit "$commit""
exit 0
fi
done
echo "No exact match found"
【讨论】: