我不加思索地手动移动了一堆文件,并且找不到找到git的方法来识别文件只是移动的,而不是实际上不同的文件。除了删除旧文件并添加新文件(从而丢失历史记录),或者使用git-mv重做所有更改之外,还有其他方法吗?
git mv。
我不加思索地手动移动了一堆文件,并且找不到找到git的方法来识别文件只是移动的,而不是实际上不同的文件。除了删除旧文件并添加新文件(从而丢失历史记录),或者使用git-mv重做所有更改之外,还有其他方法吗?
git mv。
Answers:
我认为它已经做到了。现在,我可能是错的,但是我读过git会根据文件的内容而不是基于文件系统中的位置或基于增量/差异来跟踪文件。在堆栈中,我认为它显示的就像是先删除文件再重新添加文件一样,但是由于前面提到的git跟踪内容的方式,我认为我已经尝试过一次并且仍然保持了历史记录。
仍然对某人验证我是否正确会有所帮助。对不起,如果我误解了你的问题。
要让git删除已经删除或移动的文件,只需输入
git add -u
git status不进行移动或重命名,请对其进行git add -u修复。
git不会跟踪单个文件的历史记录,并且不会特别处理移动和复制,即没有特殊的元数据指示发生移动或复制。相反,每个git commit都是工作树的完整快照。
如果您想查看移动,git log则-M除了提供列出哪些文件已更改的选项之外,还可以提供其他选项,例如
git log --summary -M
git 将查看提交历史记录中的相邻树,并推断每次提交是否移动了任何文件。
要查找副本和重命名,可以使用该-C选项,您可以提供两次,以使git看起来更难找到可能的副本源,但会牺牲一些性能。
git log --summary -M -C -C
请注意,随着Git并不保存文件历史记录(仅提交历史),即使你没有git rm和git mv文件,你就不会丢失任何历史。路径中的所有更改仍将被记录并显示在中git log。
diff.renamesconfig变量设置为。有关详细信息,请参见git-config联机帮助页。true.git/config~/.gitconfig
为了更好地理解Git为什么不进行重命名检测而不是(更常见的)显式重命名跟踪,以及git log 路径限制的工作原理,您可以阅读Git维护者Junio C Hamano撰写的Linus最终内容跟踪工具博客文章(及其中的参考文献)。
您可以将新文件移动/重命名为它的旧名称和git之外的路径,然后用于暂存git mv移动。例如在bash中:
mv $NEW $OLD && git mv $OLD $NEW
它有点麻烦1,特别是如果您必须手动操作。但是它的优势在于,它可以保留其他更改,例如未命名的命名空间或类名的更改,因此您可以检查它们,并且仅在有意这样做时才对其进行更改。
1 我希望找到一个更好的替代方法,并在找到它时更新我的答案。
例子:我移动了一堆文件 oldDir以newDir及与其他一些积极的变化开始。现在,我要检查进行了哪些其他修改。使用吉特 xargs 高克 和 重击 结果(一行):
git status --short |
gawk '/^\?\?/ && match($0, /newDir\/(*.\.cs)/, a) {print "newDir/" a[1] " " "oldDir/" a[1]}' |
xargs -n 2 bash -c 'mv $0 $1; git mv $1 $0'
现在git status将重命名显示为“要提交的更改”,并将文本修改显示为“未暂存用于提交的更改”