2010-11-14 158 views
18

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

在阅读了几个问题(Getting Git to Acknowledge Previously Moved FilesHow to make git mark a deleted and a new file as a file move?)之后,我比刚开始的时候更加迷失方向。这听起来像是从那些答案中我根本无法解决这个问题?我非常感谢这里的任何帮助。

+3

@JUST:这次你的意见不对。 SO绝对是版本控制问题的正确地方。 OP的前面的git问题的链接确实表明了这一点?只要看看FAQ:“程序员常用的软件工具”。我认为这是你的近距离投票 - 也许你应该去看看常见问题解答和特权页面,然后再次运用该特权。 – Cascabel 2010-11-14 15:46:34

+0

@Jefromi:我听到你的声音,但自从“标记集”出现后,我停止了这种战斗;)参见http://blog.stackoverflow.com/2010/11/stack-overflow-homepage-changes/#comment -51797。他们可以在任何他们想要的地方移动这些问题......我会*看到*他们;) – VonC 2010-11-14 16:13:18

+0

@VonC:我认为我们仍应该试着将问题保存在一个地方,如果不是我们,寻找答案。 – Cascabel 2010-11-14 16:36:26

回答

9

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

有些工具,比如GitHub,会考虑一个提交,它包含一个名为X的文件已被删除,一个名为X的文件已经创建了文件移动。根据Linus Torvalds的说法,文件移动只是重构的一个特例;出于这个原因,Git不会以不同的方式对待它。像其他许多人一样,处理这种特殊情况只能留给更高层次的工具(如前端)。

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

+2

我一般都不了解Git,但如果你移动它,Github会丢失一个文件的历史记录。我在我的一个github仓库中看到了这个问题,现在我移动了整个目录结构,其中的所有文件现在都显示为历史记录中有1个元素。 – Powerlord 2013-04-19 15:30:00

+0

您的答案中的链接已死,您是否有其他来源?或者你可以只发布整个报价? – ProgrammerAtWork 2016-09-22 08:01:26

+0

除了提供的链接没有其他来源..似乎整个http://permalink.gmane.org/不按预期工作 – 2016-09-23 15:41:58

0

如果您确实缺少历史修订(从您的问题中未能完全清楚哪些实际上缺失),并且只有大约一个月的时间,您可能还有时间 - 查看reflog;它会保留您检查过的每个参考文献的副本,所以如果您犯了一个错误,您可以恢复您以前的工作。

默认情况下,将reflog条目保留90天,它们已过期git gc

git help reflog 
+0

我应该更清楚 - 我不会丢失数据,但是当我尝试在git GUI中查看给定文件的历史记录时,它只显示回我的“重组”提交 – refulgentis 2010-11-14 09:03:18

2

您是否尝试设置config diff.renames

diff.renames 

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

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

+0

似乎TC实际上已经删除了一个文件,然后在稍后(或类似的)修复了它,这意味着Git不会将其检测为重命名。 – erjiang 2010-11-14 16:01:56

+0

我没有 - 没有骰子。这个存储库在GitHub上也是'破碎'的,如果我可以让GitHub正确读取它,我会很高兴。 – refulgentis 2010-11-15 19:44:44

0

我会运行一个通过所有对象的脚本。您需要首先解压缩所有包文件。该脚本会检查类型,如果它是一个提交,您会看到如果您是作者。然后检查日期。列出这些和你想要的文件名称的grep。一旦你提交的利益,创建一个分支与

git branch RecoveredWork hash-of-your-commit 

,看看你是否有所有你想与

git log RecoveredWork --graph --decorate 

从这里你可能需要做一些过滤器的分支,接枝和/或重新链接历史再次。

2

至于我看到你想要的:

git log --follow some_file.cpp 

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

0

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

如果不是的话,你可能需要看看提交与git log -M -C

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 

完成后,我创建了一个名为“reorganized”的新分支,这样我就不会干扰另一个开发人员在master分支中工作的工作。他继续研究这些文件,当他向主人推进新的变化时,我将这些变化拉入并合并到了我的分支中,并且一切都如我所愿。已移动的文件从原始位置正确引用,并收到其提交。

相关问题