如何告诉Git它是同一个目录,只是一个不同的名称

Win*_*Win 25 git

在学习了Git的几个障碍之后,我遇到了一个新的挑战:重命名目录(在本地,在工作目录中).

当我键入时git status,它会将旧目录名中的所有文件(在新目录中存在与新目录中完全相同的文件名)列为已删除,新目录名称为"未跟踪".

有没有办法告诉Git"它实际上是同一个目录,只是一个不同的名字"?

这样所有文件都只会被git status修改列出 ?

举例来说,这是git status我重命名整个目录时收到的输出:

git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    old-dir-name/file1
#   deleted:    old-dir-name/file2
#   deleted:    old-dir-name/file3
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   new-dir-name/
no changes added to commit (use "git add" and/or "git commit -a")
~/sb/ws>
Run Code Online (Sandbox Code Playgroud)

Phi*_*ler 18

只是git add新名称的目录.Git没有明确跟踪重命名,它只是稍后检测它们.git mv可能会稍微提高效率(因为它可以直接更新索引),但效果完全相同.

  • @WinWin:这取决于工具.例如,`git diff`有一个`-M`选项,允许您指定文件必须匹配多少才能显示为重命名. (2认同)

Win*_*Win 14

这里的所有答案对于我所面临的特定场景的实际解决方案的方式非常有帮助.我正在以实际步骤的形式提供对我有用的东西,希望能帮助其他人遇到同样的挑战:

  1. git mv <old-dir-name> <new-dir-name>
  2. git status(验证所有标记为重命名的文件,而不是"已删除")
  3. git commit -a -m "git mv <old-dir-name> <new-dir-name>" (这是一个"假的"提交,为后续步骤中的真实重命名做准备)
  4. git branch git_mv_20110708_1500_DO_NOT_USE (带有时间戳的"假"分支,提醒我们只将其作为解决方法)
  5. /bin/rm -Rf <new-dir-name>
  6. cp -Rp .../<new-dir-name> . (使用重命名的名称复制实际文件夹)
  7. git status(现在,大多数修改过的文件都会被正确标记为已 修改,而不是"已删除".已重命名的文件将被标记为已删除添加,尽管内容相同! - 如果重命名跟踪,则重复执行这些文件的步骤1-7他们也需要)
  8. git add <untracked files>
  9. git commit -a -m "finally renamed this folder"
  10. git branch FOLDER_RENAMED :)

PS gitk喜欢这个,但Emacs仍然与重命名混淆.:(


doc*_*ess 5

您需要使用git的mv:http : //www.kernel.org/pub/software/scm/git/docs/git-mv.html

git mv old_dir new_dir
Run Code Online (Sandbox Code Playgroud)

因此,您需要将新目录移回旧目录,然后使用mv重新移动它。

编辑:要回答我的回答:

我决定自己测试一下。我创建了两个文件,具有鲜明的文字,并用git mv一个,并且mv file file2git add file2git add -u另一方。提交消息表明两者都被跟踪为重命名。因此,正如其他人所说,我的建议仅是节省了一步。

  • 这相当于只对旧文件名执行git rm,对新文件名执行git add。Git跟踪内容,而不是更改。当您要求更改时,将按需推断出更改。 (7认同)