代码之家  ›  专栏  ›  技术社区  ›  refulgentis

重新组织项目文件夹后丢失Git历史记录

  •  18
  • refulgentis  · 技术社区  · 14 年前

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

    看完几个问题后( Getting Git to Acknowledge Previously Moved Files , How to make git mark a deleted and a new file as a file move? )我比刚开始的时候更迷路。从这些答案看来,我根本解决不了这个问题?我真的很感谢你们的帮助。

    7 回复  |  直到 10 年前
        1
  •  10
  •   Patrick Brinich-Langlois    12 年前

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

    有些工具,比如github,考虑提交一个包含已删除的名为x的文件和已创建文件移动的名为x的文件。

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

    有关此主题的详细信息,请检查 this answer 来自Linus Torvalds。

        2
  •  3
  •   rioki    14 年前

    就我看来,你想要:

    git log --follow some_file.cpp
    

    http://git-scm.com/docs/git-log 详情。我不确定这是否是你想要的;但在Git的情况下,Git跟踪的是内容而不是文件。问题是,确定信息确实很昂贵,并且假设通常您不需要它…

        3
  •  2
  •   VonC    14 年前

    是否尝试设置 config diff.renames ?

    diff.renames
    

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

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

        4
  •  2
  •   Steve W    10 年前

    如果要在Git中移动文件夹,可以使用 重命名 .

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

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

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

    等。

    我有个案例想把其中一个目录重命名为 SRC 我是这样做的:

    git mv folder2 newDirectory1/src
    

    这导致了一组文件如下所示:

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

    完成后,我创建了一个名为“reorganized”的新分支,这样我就不会干扰其他开发人员在主分支中所做的工作。他继续处理这些文件,当他把新的更改推给master时,我将这些更改拉入并合并到我的分支中,所有的工作都像我希望的那样。已移动的文件将从其原始位置正确引用,并收到它们的提交。

        5
  •  0
  •   Andrew Aylett    14 年前

    如果你真的错过了历史上的修改(你的问题还不完全清楚到底遗漏了什么),而且只剩下一个月左右的时间,你可能还有时间——看一下reflog;它保存了你签出的每一个参考的副本,所以如果你犯了错误,你可以取回你以前的。

    默认设置是保留reflog条目90天,过期时间为 git gc .

    git help reflog
    
        6
  •  0
  •   Jeff Ferland    14 年前

    我能想到一些可能性。如果事情只是一团糟,但不跟踪,那么我假设这是在两个不同的承诺中完成的……一个删除,然后一个重新添加。在此之前在提交中创建一个新的分支,将接下来的两个提交作为一个提交加载,然后在此之后追加所有内容。

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

        7
  •  0
  •   user229044    13 年前

    我将运行一个贯穿所有对象的脚本。您需要先解包所有的包文件。脚本将检查类型,如果是提交,您将看到是否是作者。然后检查日期。列出这些文件并用grep表示您想要的文件名。一旦您有了兴趣承诺,就可以创建一个分支

    git branch RecoveredWork hash-of-your-commit
    

    看看你有没有想要的东西

    git log RecoveredWork --graph --decorate
    

    在这里,您可能需要进行一些过滤分支、嫁接和/或重新平衡,以再次链接历史。