在git中删除hg addremove
我真的需要git中的这个命令在git中删除hg addremove,git,mercurial,Git,Mercurial,我真的需要git中的这个命令 hg addremove 现在看看这个场景,看看mercurial会如何拯救我: 我在这里有一些目录var/htdocs/static/static。我不小心将文件移动到了错误的位置(使用git mv)。无论如何现在我手动移动了一些文件夹: mv static static2 mv static2/static ./ 也许我也改变了这里的一些文件。。。现在一切都很好。。。所以现在git不知道发生了什么?他如何能够像mercurial使用addremove那样跟踪
hg addremove
现在看看这个场景,看看mercurial会如何拯救我:
我在这里有一些目录var/htdocs/static/static。我不小心将文件移动到了错误的位置(使用git mv)。无论如何现在我手动移动了一些文件夹:
mv static static2
mv static2/static ./
也许我也改变了这里的一些文件。。。现在一切都很好。。。所以现在git不知道发生了什么?他如何能够像mercurial使用addremove那样跟踪文件的移动而不发出通知
例如,现在使用mercurial,我可以做到:
hg addremove --similarity 80%
就是这样-mercurial通过识别文件内容跟踪文件移动的位置,我保存了我的文件历史记录
一个年轻人有一些技巧:
git add .
git ls-files --deleted | xargs git rm
但这就像当年的CVS一样。删除文件就是添加文件。保存文件历史记录怎么样?Git不会通过其他元数据跟踪重命名,因此您可以在完全保证不丢失任何元数据的情况下执行
Git add-A
虽然Git跟踪的是“整棵树”的历史记录而不是文件历史记录,但您可以在事后使用诸如
Git log-M-C
和Git log--follow
之类的命令激活其重命名和复制检测。基本上,Git总是自动执行类似于“addremove”的操作当应用提交更新工作树时:它查看提交中添加和删除的文件,并检测可能重命名的添加和删除的文件对(使用“更改量”启发式)。因此,您不必使用特殊命令;只需进行添加和删除操作,git就会自己解决问题
在您的示例场景中,只需告诉git有关新文件的信息:git add static
,以及有关已删除文件的信息:git add-u static
,就可以提交了。如果在提交之前执行git status
,可以看到它已检测到重命名
[另一个答案提到,
git add-A
是一个很好的快捷方式,它只添加工作树中的所有内容,包括新文件和已删除的文件;使用上面更窄的命令的唯一原因是,如果您希望避免添加工作树中发生的其他更改。]简短回答。与git中的hg addremove
最相似的命令是:
git add -A
哎哟
git add --all
对不起,我今天心情不好。你能编辑我应该输入什么命令而不是hg addremove来实现我的场景吗?我有5个命令,而不是一个(像在hg中),这让我非常困惑,所以我只是问一下你的文章的一个小版本,上面引用了所有的命令commands@holms:如果你的意思是相当于
hgaddremove
,那么就像我说的那样gitadd-A
。git不关心在add
时间进行重命名,因此--相似性
与从hg
到git
@holms的转换无关:注意git add-A
也会对已跟踪的文件进行阶段性更改。我不确定hg addremove
是否有这种效果。所以你告诉我git add-A可以跟踪重命名,我所有的文件历史记录都会被保存?=)@holms:我是说git不会显式跟踪重命名,不管你如何添加或删除文件,所以不管你怎么做。任何重命名检测都只发生在事实发生之后。最后,通常有人会解释这个=)thnx。我想很多用户都有这个问题。。没有人对幕后发生的事情说什么..谢谢:)顺便说一句,另一个回复提到的“git add-A”是一个很好的快捷方式,如果你没有其他变化(我更新了我的答案,也包括了这一点)。我相当肯定git不会在提交时进行重命名检测,而是在提交后分析中,正如查尔斯·贝利(Charles Bailey)所说:@MaxNanasy你是对的,但你似乎误解了我所说的话(或者说,无论如何,你是想说的话)。我没有说git进行“提交时间”重命名检测,我说的是“git在向工作树应用提交时检测重命名”,即“事后”。我认为我的措辞在技术上有点笨拙,因为git实际上没有“应用提交”;我稍后会设法修改措辞,使之更加精确。