在Git存储库中移动文件

在Git存储库中移动文件,git,version-control,Git,Version Control,我想在Git repo中重新构造文件和文件夹,而不会丢失历史记录 当前的Git回购已从SVN迁移,并且其中包含SVN历史记录 现在,当我尝试在Git repo周围移动文件时,我丢失了当前的Git历史记录,但是我有从SVN迁移过来的旧SVN历史记录。但是,当我移动文件和文件夹时,我希望有所有的历史记录 我试过git mv,log--follow,只是剪切和粘贴,等等。。。但是没有任何东西可以跟踪新的Git历史 我被互联网上的各种答案弄糊涂了。不幸的是,没有什么对我有用( 有什么建议吗 谢谢, Va

我想在Git repo中重新构造文件和文件夹,而不会丢失历史记录

当前的Git回购已从SVN迁移,并且其中包含SVN历史记录

现在,当我尝试在Git repo周围移动文件时,我丢失了当前的Git历史记录,但是我有从SVN迁移过来的旧SVN历史记录。但是,当我移动文件和文件夹时,我希望有所有的历史记录

我试过git mv,log--follow,只是剪切和粘贴,等等。。。但是没有任何东西可以跟踪新的Git历史

我被互联网上的各种答案弄糊涂了。不幸的是,没有什么对我有用(

有什么建议吗

谢谢,
Vashni不跟踪文件历史记录

Git跟踪内容,并保存提交历史记录

这意味着,如果您有一些现有的提交,然后移动文件并以现有提交作为其历史记录进行新提交,则新提交将旧提交作为其提交历史记录

四处移动的文件没有历史记录,但旧文件也没有历史记录。当您使用
git log
时,您正在查看提交历史记录,如果未指定开始提交,则从您命名的提交开始,
git log
头开始,然后从那里返回到旧的提交

即使您使用
git log--path
,这也是正确的:您仍然在查看提交历史。您只是指示git只显示提交历史的一个子集,即提交,其中
path
在该提交和它的前一个提交之间发生了更改。也就是说,如果您在日志中看到提交
1234567
,这意味着ns
git 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