VS Code 'git mv' 来保存文件历史记录?

Rya*_*thm 15 git visual-studio-code

VS Code 中是否有任何方法可以更改文件名,以便将文件历史记录保留在 git 中,并且不会认为跟踪的文件已被删除?

我希望命令的 GUI 实现:

git mv oldName.abc newName.xyz
Run Code Online (Sandbox Code Playgroud)

谢谢

Che*_*yDT 11

没有必要。只需重命名文件。无论是否git mv使用,Git 都会检测重命名。

试试看:以正常方式重命名,以旧名称和新名称暂存文件(或直接执行git add .),然后git status在控制台中运行,它应该显示为重命名而不是创建和删除,所以历史总是保存。

  • 当我运行 `git status` 时,我看到“更改未暂存提交:...”“已删除:{旧名称}”,在未跟踪的文件下,我看到新重命名的文件 (7认同)
  • 是的,但是一旦你上演它们,它看起来就会不同 (5认同)
  • 通过 IDE 移动文件时需要自动 git mv 是有原因的。git 会在“大多数情况下”检测到移动,但不是全部。典型的情况是当您在同一次提交中对文件进行后续修改时。在这些情况下,git 显然无法检测到移动。不幸的是,这些案例并不罕见。这就是为什么多个其他 IDE(根据我的经验,特别是 IntelliJ 和 Netbeans)在移动或重命名文件时显式执行 git mv。然后 git 就可以清楚地知道文件已被移动,不可能有任何歧义。 (4认同)
  • 如果将它们移动到另一个文件夹怎么办? (2认同)
  • 我不确定您指的是什么...它工作正常,只需记住,您必须将其暂存于旧名称/位置和新名称/位置下,然后才能将其视为重命名操作(因为索引是基于文件名,直到文件也以新名称添加到索引中,您得到的只是已索引的文件的删除,以及尚未在索引中的未跟踪的新文件)。 (2认同)

Jer*_*ers 10

由于 git 有时无法检测重命名操作,我已在 Visual Studio Code 中安装了此扩展,到目前为止,该扩展似乎可以很好地重命名文件并在git mv下面执行以下操作:

https://marketplace.visualstudio.com/items?itemName=ambooth.git-rename

README.md中最酷的一点是,在重命名期间可以指定新的目录位置:

用法

右键单击文件资源管理器中的文件并选择“重命名 (git-mv)”。使用出现的输入文本字段,输入新名称并按 Enter 键。注意:还可以通过调整路径来更改目录位置。

  • 多么节省时间啊。我尝试将 F2“重命名”绑定切换到此命令,但不幸的是这不起作用。VS Code 会显示一条错误消息,与主题有关。 (2认同)
  • @JeroenWiertPluimers是的,`mv`和`giv mv`之间的唯一区别是后者会在重命名后更新索引,所以你只需要提交 - 如果这就是你想要的,使用`git mv`,或者只使用常规的“mv”,然后手动暂存或提交所有更改。就我个人而言,我已经停止使用“git mv”,因为我发现如果您要进行不止一项更改,自动暂存可能会更加令人困惑而不是有帮助。 (2认同)

DLi*_*ght 9

Git 不存储文件被重命名的信息。它仅在进行比较时才检测到它(在git diff///status等中log)。(来源

\n

有一个选项-M可以控制重命名检测的级别。

\n
       -M[<n>], --find-renames[=<n>]\n           Detect renames. If n is specified, it is a threshold on the similarity index (i.e. amount of addition/deletions compared to the file\xe2\x80\x99s size).\n           For example, -M90% means Git should consider a delete/add pair to be a rename if more than 90% of the file hasn\xe2\x80\x99t changed. Without a % sign,\n           the number is to be read as a fraction, with a decimal point before it. I.e., -M5 becomes 0.5, and is thus the same as -M50%. Similarly, -M05\n           is the same as -M5%. To limit detection to exact renames, use -M100%. The default similarity index is 50%.\n
Run Code Online (Sandbox Code Playgroud)\n

尝试一下:

\n
git status -M10%\n
Run Code Online (Sandbox Code Playgroud)\n

对于 VS Code,您可以使用GitLens扩展,它提供了一个选项来控制这个阈值,该设置称为similarityThreshold.

\n
gitlens.advanced.similarityThreshold    Specifies the amount (percent) of similarity a deleted and added file pair must have to be considered a rename\n
Run Code Online (Sandbox Code Playgroud)\n

尝试将其设置为10并通过 GitLens 检查历史记录,它应该可以更好地检测文件重命名。

\n

  • @Christoph我不这么认为,请参阅[Git常见问题解答](https://git.wiki.kernel.org/index.php/GitFaq#Why_does_Git_not_.22track.22_renames.3F):“Git有一个重命名命令git mv,但这只是为了方便。其效果与删除文件并添加另一个具有不同名称和相同内容的文件没有区别。” (2认同)