在Visual Studio(2013)中将文件重命名,如何将其作为GIT重命名在GIT中传播?

8
我们使用GIT和Visual Studio 2013(Ultimate + Professional版本)。解决方案和项目的代码都在GIT中,每当我们在Visual Studio中重命名文件时,GIT会将它们视为:

重命名前

c:\temp\testCodeSnippets>git status
# On branch master
nothing to commit (working directory clean)

从 Visual Studio 重命名后

c:\temp\testCodeSnippets>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:    OldName.cs
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       NewName.cs
no changes added to commit (use "git add" and/or "git commit -a")

通过git mv重命名
c:\temp\testCodeSnippets>git mv OldName.cs NewName.cs

c:\temp\testCodeSnippets>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       renamed:    OldName.cs -> NewName.cs
#

基本上,在VS中进行的重命名仍然需要一些手动工作。同样重要的是,许多这些重命名是在IDE内部重构时发生的,即对类/成员等进行重命名并更改所有引用。如果命名空间或类名更改,则文件将被重命名。
那么,是否有任何设置可以切换,任何工具可以安装,任何神灵可以安抚,以便从Visual Studio进行的重命名也可以映射为GIT的重命名(就像git mv一样使其平稳)?

2
据我所知,git中的add+remove与rename/move是等效的。它会自动识别你所做的操作。这是它相对于svn的一个重大优势,后者需要显式地跟踪重命名操作。 - CodesInChaos
可能是让Git跟踪重命名和编辑的文件的重复问题。 - Edward Thomson
Visual Studio使用与git相同的启发式算法来检测重命名。您是否看到git status将这些项目报告为重命名,但Visual Studio没有?您能展示一些文件和屏幕截图以提供更多细节吗? - Edward Thomson
@EdwardThomson:我们不使用VS来报告git状态。我们使用git(bash)或Tortoise Git与git进行交互,但用于开发/重构等。 - DeepSpace101
1
我明白了。正如其他人所指出的那样,Git 中没有“重命名”功能,而是通过比较已添加和已删除文件之间的相似度,并建议在 git statusgit diff 中发生了重命名。Visual Studio 不会更改此行为,它只是未执行这些更改。 - Edward Thomson
1个回答

10

核心git(命令行应用程序)仅通过在添加文件和删除文件之间检测重命名来识别它们。

然而,Visual Studio不会在操作期间对您进行更改的暂存。相反,在提交时将对更改进行暂存。有几个原因,但主要是因为每次保存都将文件放置在对象数据库中,这样做成本非常高。

您需要使用git addgit rm手动暂存更改,您的重命名将像以往一样通过将添加的更改与重命名的更改进行比较来报告。

(请注意,由于Visual Studio不会在操作期间暂存您的更改,因此它将检查已暂存和未暂存的文件以进行重命名检测。因此,Visual Studio会比核心git更早地报告重命名。但是,在您对这些更改进行暂存后,它们应该在状态上显示相同结果。)


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