Git 可以在不丢失历史记录的情况下重组我的文件夹吗?

Posted

技术标签:

【中文标题】Git 可以在不丢失历史记录的情况下重组我的文件夹吗?【英文标题】:Can Git restructure my folders without losing history? 【发布时间】:2012-06-05 09:29:30 【问题描述】:

我有一个 git repo,目前我是唯一一个使用它的人。 我想把根文件夹下的所有文件和文件夹,放到一个新文件夹中。

当前结构:

主要-> 源代码 资源

新结构:

主要-> 应用程序1 源代码 资源

有没有办法让文件不会丢失它们的 git 历史记录?

【问题讨论】:

This answer 向您展示如何在重命名/移动之前查看历史记录。 在您移动文件夹/文件后执行git add -A .。确保您没有进行任何修改。 类似问题***.com/questions/2314652/… 我遇到了一些类似的问题。所有答案似乎都缺少一些细节,但确实帮助我弄清楚了。我必须 mkdir、git add directory、git mv ...、git commit,然后使用 git log --follow 文件名检查旧历史。告诉 git 在将文件移动到新目录之前添加新目录会产生很大的不同,即使它是空的并且 git status 之前或之后都没有显示它。 (这应该是答案,但我不会在 4 年后尝试添加新答案。) @Kenny Ostrom 不正确,git add empty directory 是一个 NOOP。无论如何,仅仅因为我们移动了文件就不得不使用--follow,这很糟糕 【参考方案1】:

TL;DR

继续:移动您的文件和目录。只需确保在目录重组的同一提交中不要对文件进行任何编辑。

为什么会起作用

Git 是一个内容跟踪器,而不是一个文件跟踪器。如果您移动/重命名文件,但没有对这些文件的 content 进行其他更改,那么 Git 只需 rewrites the tree objects。目录操作不会更改文件 blob;目录位置信息单独存储在树对象中。

实际重命名检测由diffing the blobs and trees 处理,并寻找文件之间可配置的相似性百分比。这意味着 Git 并没有真正直接存储移动或重命名。它计算提交之间的差异。

所有这一切的结果是您的历史不受特定文件名或目录结构的约束。这对于大多数用例都非常有效,但与 Bazaar 等将重命名为一流操作的系统形成鲜明对比。

【讨论】:

重命名父文件时,我丢失了子文件的历史记录? @Cian 你要么不理解答案,要么做错了什么,要么有不寻常的边缘情况。您应该提出一个新问题,并提供尽可能多的详细信息和支持证据。 我可能有一个奇怪的案例,或者有误解-我会更详细地看一下并发布一个Q。干杯 Git 只检测到使用 git mv 完成的重命名,对我来说。此外,由于最初的问题涉及 mkdir(我的问题也很相似),我必须在移动文件之前 git add empty directory name。 @CodeGnome git 确实跟踪更改和移动。我做了一个小检查,它似乎有效。你可以检查这个提交github.com/aoancea/git-history/commit/…【参考方案2】:

您只需移动文件,Git 就会(或应该)注意到移动已经发生。它将保留历史记录。

如果它没有出于某种原因注意到移动,您可以尝试使用带有--find-copies-harder 选项的差异。

【讨论】:

这个答案是正确的。如果你做mkdir app1 && git mv src res app1 && git commit,Git 可以帮助你一点。假设您实际上在 srcres 中都有一些文件(如果没有,git 会忽略空目录)。【参考方案3】:

当我移动或重命名某些文件时,我也丢失了历史记录。但我试图访问 TortoiseGitSourceTree 应用程序。

当我尝试使用 git bash 命令时,我发现我可以看到历史记录。

$Git log

在网上花了几个小时了解原因后,我终于找到了答案。

Tortoise git 默认设置,仅向我们显示实际文件历史记录。我的意思是,如果你重命名,如果你移动任何文件或文件夹,你就看不到历史记录。 要查看历史记录,您必须单击 TortoiseGit 设置上的以下复选框。

【讨论】:

以上是关于Git 可以在不丢失历史记录的情况下重组我的文件夹吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不丢失历史记录的情况下从 SVN 存储库中删除***目录?

如何使用 git reset 在不丢失本地更改的情况下重置未推送的提交

Git:如何在不丢失当前分支的情况下克隆项目?

如何在不使用渐变维度的情况下在维度中创建数据历史记录?

如何在 Github for Windows 崩溃后恢复 repo?

如何在不更改浏览器历史记录的情况下更改 url