如何在Git中处理(子)目录重命名?

4

我正在考虑使用Git作为本地开发者版本控制系统的支持(这是为了多学科开发)。

以前的做法是每个试用版本都会将顶级目录重命名(并保留一个zip副本)。对于1-2人团队来说,这种方法相当有效。版本之间使用Beyond Compare进行比较。

然而,快速尝试将Git应用于该方法后,它“认为”文件已被删除并创建了新文件,而不仅仅是在新路径上。

因此,我们有:

\GIT-Dir  
  \.git
  \Master-with-updating-version-name1  
    \ProjectName  
      \Source  
        files.etc  

变成

\GIT-Dir  
  \.git
  \Master-with-updating-version-name2  
    \ProjectName  
      \Source  
        files.etc  

并且,接着

然后

\GIT-Dir  
  \.git
  \Master-with-updating-version-name3  
    \ProjectName  
      \Source  
        files.etc  

鉴于我需要在过渡期间保持旧方法的活性,有哪些选项?
a/ 如何让Git认识到这只是路径更新?
b/如何确保较低级别的文件被正确跟踪和差异化?

我使用Windows,GitGui 0.13和git 1.7.4.msysgit.0,并安装了GitExtensions 2.21。

2个回答

3

Git不会跟踪重命名,它会在logshow命令中回顾性地确定它们。您不必使用git命令显式重命名/移动文件或目录。

重命名是由差异阈值确定的,如果文件被添加和删除且内容足够相似,则git将视其为重命名/移动。

如果您在git之外重命名目录,然后执行git status,您会看到它将它们作为删除项。现在将它们都添加到索引中(git add -A即可),您应该能看到它将它们视为重命名。


我的玩具测试没有成功。我需要尝试使用更大的文件 - 什么是一个好的最小大小? - Philip Oakley
我得到了不同的结果(也就是两个显示意味着不同的事情)。 git add -A ,然后是 git status,说明我们有一个重命名,但是 Git Gui 仍然显示情况是删除并创建一个新文件(这只是在执行提交之前)。 - Philip Oakley
刚刚尝试了 git whatchanged -r(在 git bash 中执行),它展示了文件的添加和删除,但同时显示内容 blob sha1 的值未改变(除了我故意更改以测试 diff 是否能捕获到更改)。 - Philip Oakley
1
Git Gui不是完美的,也不能完成很多命令行所能做的事情,要相信命令行。阅读一下《Git社区书籍》(http://book.git-scm.com/)或者《Git Pro》(http://progit.org/)了解Git如何处理内容。大部分时间以文件和目录为基础思考是无益的。如果哈希值相同,git将把它们视为移动/重命名。 - James Gregory
1
@James Gregory:感谢您的更新。看起来我需要查看(支持)GitGui本身,因为它当前的响应可能无法获得我将要推广Git的社区的认可。当我们目前的简单/愚蠢/有效方法与GitGui的观点不匹配时,这是很棘手的。我需要良好的演示问题(显然;-)。 - Philip Oakley
如果你需要GUI界面,那么比git gui更好的选择是存在的。这当然取决于你所使用的平台,但是在这里有一个GUI列表。我一直认为git gui对于命令行用户来说是一个有用的工具,偶尔想在GUI中查看一些内容,但我不会全职使用它。 - James Gregory

2
在命令行中,您可以使用git mv命令重命名文件或目录。在GUI界面中,应该有一个相应的选项来实现此功能。

GUI似乎没有相应的命令(或菜单项)。我尝试过使用Git Bash窗口,但在Git Gui重新扫描后,Git仍然会显示该分支中旧目录中的文件已被删除并在新目录中创建了新文件,而不是显示它们已被重命名(重路径) ,然后显示更改文件的差异。 - Philip Oakley
@Philip:那么你的GUI有所欠缺。不过这并不重要,因为Git会由于其哈希算法而永远不会将两个完全相同的文件存储在仓库中。 - Fred Foo
它在git bash中也会发生(请参见我回复James Gregory的评论)。您是正确的,它只存储了一次共同的内容,但然后继续报告所有内容都已更改 :-( - Philip Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接