【问题标题】:How to work with (sub)directory renames in Git?如何在 Git 中使用(子)目录重命名?
【发布时间】:2011-08-19 09:03:36
【问题描述】:

我正在考虑将 Git 用于本地开发人员 VCS 支持(这是用于多学科开发)。

以前的做法是为每个试用版重命名顶级目录(并保留一个 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

【问题讨论】:

    标签: git


    【解决方案1】:

    在命令行中,您可以使用git mv 重命名文件或目录。你的 GUI 应该有一个选项。

    【讨论】:

    • gui 似乎没有命令(或菜单项)。我已经通过 git bash 窗口尝试过,我仍然得到 Git 说(在从 Git Gui 重新扫描之后),对于这个分支,旧目录中的文件被删除,新目录中的文件被创建,而不是而不是显示它们 (a) 已被重命名(重新路径),然后 (b) 显示更改文件的差异。
    • @Philip:那么你的 GUI 就没有了。不过没关系,因为 Git 永远不会存储到 repo 中的两个相同文件,因为它的哈希值。
    • 它也发生在 git bash 中(请参阅我对 James Gregory 的回复)。你是对的,它只存储了一次公共内容,然后继续报告一切都改变了:-(
    【解决方案2】:

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

    重命名是由一个差异阈值决定的,如果有一个文件的添加和删除并且内容足够相似,那么 git 会认为它是一个重命名/移动。

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

    【讨论】:

    • 它不适用于我的玩具测试。我将不得不尝试使用更大的文件 - 最小大小是多少?
    • 我得到了不同的结果(即两个显示意味着不同的东西)。 git add -A,后跟 git status 表示我们有一个重命名,但 Git Gui 仍然将情况显示为删除和创建新文件(这是在提交之前)
    • 刚刚尝试过git whatchanged -r(在 git bash 中),它显示文件的添加和删除,但同时显示内容 blob sha1 未更改(除非我故意更改以查看diff 会抓住它)
    • Git Gui 并不完美,并且没有做很多命令行可以做的事情,相信命令行。阅读Git community bookGit Pro,了解 Git 如何处理内容。大多数时候考虑文件和目录会适得其反。如果哈希值相同,则 git 会将它们视为移动/重命名。
    • @James Gregory:感谢您的更新。看起来我会看看(支持)GitGui 本身,因为它的当前响应不太可能被我将尝试向其推广 Git 的社区所接受。当我们当前简单/愚蠢/有效的方法与 GitGui 观点不匹配时,这很尴尬。我需要很好地呈现表现性问题(显然;-)
    猜你喜欢
    • 2012-02-03
    • 2012-05-26
    • 2017-08-25
    • 2012-06-26
    • 1970-01-01
    • 2010-11-18
    • 2019-10-13
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多