hg addremove in git

时间:2011-11-05 15:11:40

标签: git mercurial

我真的需要在git中使用这个命令

hg addremove

现在看一下场景,看看mercurial将如何拯救我:

我在这里有一些dir / htdocs / static / static。我不小心将文件移动到错误的位置(使用git-mv)。无论如何......现在我手动移动了一些文件夹:

mv static static2
mv static2/static ./

也许我已经在这里更改了一些文件......现在一切都很棒......所以现在git不知道发生了什么?他如何能够跟踪文件的移动而不用像mercurial那样通知addremove。

例如现在我可以做mercurial:

hg addremove --similarity 80%

就是这样 - 通过识别文件内容来追踪文件被移动的地方,并保存了我的文件历史记录。

{{}}中的一个小伙子有一些技巧:

git add .
git ls-files --deleted | xargs git rm

但那时就像CVS一样。你删除文件,你添加文件。那么保存文件的历史呢?

3 个答案:

答案 0 :(得分:25)

基本上,当git应用提交来更新工作树时,它会自动执行类似“addremove”的操作:它会查看提交中添加和删除的文件,并检测可能重命名的已添加和删除文件对(使用“变化量”启发式)。所以你不必使用特殊的命令;只需执行添加和删除,然后git就可以自行解决问题。

在您的示例方案中,只需告诉git有关新文件:git add static以及已删除的文件:git add -u static,您就可以提交了。如果您在提交之前执行git status,则可以看到它已经检测到重命名。

[正如另一个答案所提到的,git add -A是一个很好的快捷方式,只需在工作树中添加所有,包括新文件和已删除文件;使用上述较窄命令的唯一原因是,如果您想避免添加恰好位于工作树中的其他一些更改。]

答案 1 :(得分:9)

Git不会通过其他元数据跟踪重命名,因此您可以git add -A完全确保您没有遗漏任何元数据。

虽然Git跟踪“整个树”历史记录而不是文件历史记录,但您可以使用git log -M -Cgit log --follow <file>之类的命令激活其重命名和复制检测。

答案 2 :(得分:6)

简短回答。与 git 中的hg addremove最相似的命令是:

git add -A

... Oooorr

git add --all