我得到了一个git repo current我是唯一使用它的人。 我想将所有文件和文件夹放在根文件夹下,并将其放在一个新文件夹中,例如:
当前root desc
main -> src res
新根
main -> app1 src res
如何在Windows上的git中执行此操作而不会丢失历史记录?
答案 0 :(得分:39)
继续:移动你的文件和目录。只需确保您不对目录重组中的文件进行任何编辑。
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设置上单击以下复选框。