重组项目文件夹后丢失git历史记录

时间:2010-11-14 08:43:44

标签: git version-control

我在一个月前做了一个提交,涉及我创建新的文件夹和子文件夹,并在我们之间移动我的源代码文件。我从那时起第一次浏览我的历史并且意识到git已经“丢失”历史记录,因为原始文件被删除然后重新添加,我想 - 即当我在我的git GUI中查看文件时(它是根据NDA,所以我不能直接讨论它,但是例如,这个存储库也在GitHub上被破坏.GitHub清楚地显示它将提交检测为一系列动作。)它只显示每个文件的历史记录,当项目文件夹时重组了。

在阅读了几个问题(Getting Git to Acknowledge Previously Moved FilesHow to make git mark a deleted and a new file as a file move?)后,我比起初时更加迷失。从那些答案中听起来我根本无法解决这个问题?我真的很感激这里的任何帮助。

7 个答案:

答案 0 :(得分:10)

在Git中,没有文件移动的概念。

某些工具(如GitHub)会考虑一个包含已删除的名为X的文件和一个已创建文件移动的名为X的文件的提交。

根据Linus Torvalds的说法,文件移动只是重构的一个特例;因此,Git不会以不同的方式对待它。与许多其他案例一样,这种特殊情况的处理留给了更高级别的工具(例如前端)。

有关此主题的更多信息,请查看Linus Torvalds的this answer

答案 1 :(得分:3)

据我所知,你想要:

git log --follow some_file.cpp

有关详细信息,请参阅http://git-scm.com/docs/git-log。我不确定这是不是你想要的;但是在git的情况下,git跟踪内容而不是文件。问题是确定这些信息真的很贵,并且通常认为你不需要它......

答案 2 :(得分:2)

您是否尝试过设置config diff.renames

diff.renames
  

告诉git检测重命名。如果设置为任何布尔值,它将启用基本重命名检测。如果设置为“复制”或“复制”,它也会检测副本。

注意:要在重命名后跟踪单个文件的历史记录,您需要使用“git log -p --follow file”。

答案 3 :(得分:2)

如果你想在git中移动文件夹,你可以使用 git mv

我在我的存储库的根目录中有一堆文件夹,并希望将它们移动到两个子目录中,因此我使用** mkdir创建了两个新目录。

然后我将文件和文件夹一次一个地移动到新目录中,如下所示:

git mv folder1/ newDirectory1/
git mv file1.txt newDirectory2/

我有一个案例,我想将其中一个目录重命名为 src ,我这样做了:

git mv folder2 newDirectory1/src

这导致了一组看起来像这样的文件:

repository/
   newDirectory1/
      folder1/
      src/
   newDirectory2/
      file1.txt

在我完成之后,我创建了一个名为“重组”的新分支,因此我不会干扰其他开发人员在主分支中所做的工作。他继续处理这些文件,当他向主人推动新的更改时,我将这些更改合并到我的分支中,一切都按照我的希望进行。已移动的文件已从其原始位置正确引用,并已收到其提交。

答案 4 :(得分:0)

如果你真的错过了你的历史修订版(你的问题并不完全清楚实际上缺少了什么)并且它只有一个月左右,你可能还有时间 - 看看reflog;它会保留您签出的每个参考文献的副本,因此如果您犯了错误,您可以取回之前的参考文献。

默认设置是将reflog条目保留90天,它们会被git gc过期。

git help reflog

答案 5 :(得分:0)

我会运行一个遍历所有对象的脚本。您需要先解压缩所有包文件。该脚本将检查类型,如果是提交,您将看到如果您是作者。然后检查日期。列出那些和grep以获取所需的文件名。一旦您感兴趣,请使用

创建一个分支
git branch RecoveredWork hash-of-your-commit

看看你是否拥有所需的一切

git log RecoveredWork --graph --decorate

从这里你可能想要做一些过滤分支,嫁接和/或重新定位以再次链接历史。

答案 6 :(得分:0)

我可以想到一些可能性。如果事情只是乱窜,但不跟踪,那么我认为这是在两个不同的提交中完成的...一个删除然后一个重新添加。在此之前在提交中创建一个新分支,将下两个提交加载为一个提交,然后在此之后附加所有内容。

如果不是这种情况,您可能需要查看git log -M -C

的提交