Git可以重构我的文件夹而不会丢失历史吗?

时间:2012-05-31 06:09:19

标签: git

我得到了一个git repo current我是唯一使用它的人。 我想将所有文件和文件夹放在根文件夹下,并将其放在一个新文件夹中,例如:

当前root desc

main ->
  src
  res

新根

main ->
  app1
    src
    res

如何在Windows上的git中执行此操作而不会丢失历史记录?

3 个答案:

答案 0 :(得分:39)

TL; DR

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

为什么会起作用

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

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

所有这一切的结果是您的历史记录与特定文件名或目录结构无关。这对于大多数用例来说非常有效,但与跟踪重命名为一等操作的Bazaar等系统形成鲜明对比。

答案 1 :(得分:6)

你可以移动文件,Git会(或应该)注意到移动已经发生。它将保留历史。

如果

答案 2 :(得分:1)

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

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

ZeroMemory( &spWordList, sizeof( spWordList ) );
hr = S_FALSE;
if( hr == S_FALSE )
{
  hr = cpLexicon->GetWords( eLEXTYPE_USER | eLEXTYPE_APP, &dwGeneration, &dwCookie, &spWordList );
  for( spWord = spWordList.pFirstWord; spWord != NULL; spWord = spWord->pNextWord )
  {
     for( spWordPron = spWord->pFirstWordPronunciation; spWordPron != NULL; spWordPron = spWordPron->pNextWordPronunciation )
     {
        printf( "Words in dictionnary: %i\n", dwGeneration );
        printf( "Word: %ls\n", spWord->pszWord );
        //you can also display the pronunciation of words if you wish
     }
  }
}
CoTaskMemFree( spWordList.pvBuffer );

花了几个小时在互联网上讨论了原因之后,终于找到了答案。

Tortoise git的默认设置,仅向我们显示实际文件的历史记录。我的意思是,如果您重命名任何文件或文件夹,那么您将看不到历史记录。 对于观看历史记录,您必须在TortoiseGit设置上单击以下复选框。

enter image description here