在Git存储库中移动文件
我想在Git repo中重新构造文件和文件夹,而不会丢失历史记录 当前的Git回购已从SVN迁移,并且其中包含SVN历史记录 现在,当我尝试在Git repo周围移动文件时,我丢失了当前的Git历史记录,但是我有从SVN迁移过来的旧SVN历史记录。但是,当我移动文件和文件夹时,我希望有所有的历史记录 我试过git mv,log--follow,只是剪切和粘贴,等等。。。但是没有任何东西可以跟踪新的Git历史 我被互联网上的各种答案弄糊涂了。不幸的是,没有什么对我有用( 有什么建议吗 谢谢,在Git存储库中移动文件,git,version-control,Git,Version Control,我想在Git repo中重新构造文件和文件夹,而不会丢失历史记录 当前的Git回购已从SVN迁移,并且其中包含SVN历史记录 现在,当我尝试在Git repo周围移动文件时,我丢失了当前的Git历史记录,但是我有从SVN迁移过来的旧SVN历史记录。但是,当我移动文件和文件夹时,我希望有所有的历史记录 我试过git mv,log--follow,只是剪切和粘贴,等等。。。但是没有任何东西可以跟踪新的Git历史 我被互联网上的各种答案弄糊涂了。不幸的是,没有什么对我有用( 有什么建议吗 谢谢, Va
Vashni不跟踪文件历史记录 Git跟踪内容,并保存提交历史记录 这意味着,如果您有一些现有的提交,然后移动文件并以现有提交作为其历史记录进行新提交,则新提交将旧提交作为其提交历史记录 四处移动的文件没有历史记录,但旧文件也没有历史记录。当您使用
git log
时,您正在查看提交历史记录,如果未指定开始提交,则从您命名的提交开始,git log
以头开始,然后从那里返回到旧的提交
即使您使用git log--path
,这也是正确的:您仍然在查看提交历史。您只是指示git只显示提交历史的一个子集,即提交,其中path
在该提交和它的前一个提交之间发生了更改。也就是说,如果您在日志中看到提交1234567
,这意味着nsgit diff--name status 1234567^1234567
将向您显示由path
命名的文件的状态更改(以及任何其他名称和状态更改)
(语法commit^
,是提交的任何有效名称,后跟一个^
字符,意味着查找提交的父项,即在提交之前的当前提交。您也可以将其编写为commit~1
)
添加时,请遵循(并命名一个路径
),这告诉git log
还有一件事:如果给定path
的状态更改是重命名,git log
可以更改它查看以前提交的方式。我们已经知道,由于git log
向您显示此提交,因此git diff
将显示该文件的名称和状态该文件的状态将仅为M
,表示该文件以前存在且已修改。但如果状态为R
,则表示git diff
计算出在父提交和此提交之间,该文件已重命名
如果没有--follow
,git log
可能将不再看到命名的路径(因为diff将其计算为已重命名),并将停止显示提交。(如果某些其他内容在这些早期提交中具有相同的路径,则它可能会在更早的提交中再次出现,但这取决于较早的提交,并不常见。)然而,对于--follow
,git log
注意到这样一个事实,即git diff
在刚刚进行diff时决定文件已被重命名。然后它停止在该名称下查找path
,而是开始查找git diff
决定内容已被重命名的路径从
也就是说,假设git log
将较旧的(父)提交ab93513
与较新的(子)提交进行比较提交0cea944
。进一步假设git diff
决定提交ab93513
中的dir1/dir2/old.txt
的内容变成了文件dir8/dir9/new.txt
的内容。最后,假设您要求git log
向您显示dir8/dir9/new.txt
>--遵循
选项。然后,由于此时计算的更改git diff
是“内容相似,重命名已发生”,git log
从查找dir8/dir9/new.txt
切换到查找dir1/dir2/old.txt
此过程的关键是重命名检测。由于git不跟踪文件历史,它必须检测重命名。重命名检测非常可靠,但并不完美,这取决于您如何配置git,以及文件内容是否完全匹配或仅仅“足够相似”和--follow
,在git log
中,一次只遵循一条路径(并且只有在历史中向后,当使用--reverse
时,这才应该起作用,但是实现--follow
的代码是一种可怕的黑客行为,只在一个时间方向上起作用)。git不跟踪文件历史
Git跟踪内容,并保存提交历史记录
这意味着,如果您有一些现有的提交,然后移动文件并以现有提交作为其历史记录进行新提交,则新提交将旧提交作为其提交历史记录
四处移动的文件没有历史记录,但旧文件也没有历史记录。当您使用git log
时,您正在查看提交历史记录,如果未指定开始提交,则从您命名的提交开始,git log
以头开始,然后从那里返回到旧的提交
即使您使用git log--path
,这也是正确的:您仍然在查看提交历史。您只是指示git只显示提交历史的一个子集,即提交,其中path
在该提交和它的前一个提交之间发生了更改。也就是说,如果您在日志中看到提交1234567
,这意味着ns那git dif