我有一个Git仓库,我已经删除了使用rm
(不是 git rm
)的四个文件,我的Git状态如下所示:
# deleted: file1.txt # deleted: file2.txt # deleted: file3.txt # deleted: file4.txt
如何从Git中删除这些文件,而无需手动浏览并添加如下所示的每个文件:
git rm file1 file2 file3 file4
理想情况下,我正在寻找能够以同样方式工作的东西git add .
,如果可能的话.
$ git add -u
这告诉git自动暂存跟踪的文件 - 包括删除以前跟踪的文件.
分阶段整个工作树:
$ git add -u :/
仅仅暂存当前路径:
$ git add -u .
git ls-files --deleted -z | xargs -0 git rm
可能是你在找什么..它对我有用..
您可以使用
git add -u
要将已删除的文件添加到暂存区域,请提交它们
git commit -m "Deleted files manually"
如果您只是运行:
git add -u
git将更新其索引,以便知道您删除的文件实际上应该是下一次提交的一部分.然后你可以运行"git commit"来检查那个变化.
或者,如果您运行:
git commit -a
它将自动进行这些更改(以及任何其他更改)并提交它们.
更新:如果您只想添加已删除的文件,请尝试:
git ls-files --deleted -z | xargs -0 git rm git commit
你可能正在寻找-A:
git add -A
这类似于git add -u,但也添加了新文件.这大致相当于hg的addremove
命令(尽管移动检测是自动的).
台数只已删除的文件:
for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done
或者(xargs方式):
git status | awk '/deleted/ {print $2}' | xargs git rm
您可以为首选命令集设置别名,以方便以后使用.
git rm test.txt
删除实际文件之前或之后.
通过使用带有'--all'或'--update'选项的git-add,您可能会得到比您想要的更多.新的和/或修改过的文件也将添加到索引中.我有一个bash别名设置,当我想从git中删除已删除的文件而不触及其他文件时:
alias grma='git ls-files --deleted -z | xargs -0 git rm'
已从文件系统中删除的所有文件都将添加到已删除的索引中.
并不是真的很重要,但我不同意所选择的答案:
git add -u
...如果已删除工作树中的相应文件,将从索引中删除文件,但它也会暂存已修改的跟踪文件的新内容.
git rm $(git ls-files --deleted)
...另一方面,只会删除被跟踪的已删除文件.
所以后者在我看来是更好的选择.
如果这些是唯一的变化,你可以简单地做
git commit -a
提交所有更改.这将包括已删除的文件.
git ls-files --deleted | xargs git rm
是仅添加已删除文件的最佳选项.
这是一些其他选择.
git add . => Add all (tracked and modified)/new files in the working tree. git add -u => Add all modified/removed files which are tracked. git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree. git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
git add -u
-u --update仅匹配索引中已跟踪的文件而不是工作树.这意味着它永远不会暂存新文件,但它会暂存已修改的跟踪文件的新内容,并且如果已删除工作树中的相应文件,它将从索引中删除文件.
如果没有,则默认为"."; 换句话说,更新当前目录及其子目录中的所有跟踪文件.
这个简单的解决方案适合我:
git rm $(git ls-files --deleted)
如果你想将它添加到你.gitconfig
这样做:
[alias] rma = !git ls-files --deleted -z | xargs -0 git rm
然后你要做的就是运行:
git rma
git ls-files --deleted -z | xargs -0 git rm --cached
这将删除之前由git跟踪的所有已删除文件,以及处理文件名中包含空格的情况.
根据您的POSIX变体,您可能需要使用xargs -0 -r
:这将导致xargs
在管道空内容时正常退出.
编辑:--cached
和--deleted
标志串联使用,以防止意外删除尚未删除的文件.
即使您有大量要处理的文件,以下内容也可以使用:
git ls-files --deleted | xargs git rm
您可能还想提交评论.
有关详细信息,请参阅: 有用的Git脚本
试试吧.
-a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add . && git commit -m -a "Your commit"
要么
git add --all && git commit -m "Your commit"
请-t
用以查看实际运行的命令
我只是调整了Virender的答案来做同样的事情:
git ls-files --deleted -z | xargs -t -0 git rm
git-add的所有标志都不会仅删除已删除的文件; 如果您修改了所有已删除的文件,那么您没问题,但除此之外,您需要运行git-status并解析输出.
根据Jeremy的回答,这就是我得到的:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
获取文件的状态.
对于已删除的文件,请隔离该文件的名称.
删除所有以#开头的行,以及其中包含"已删除"字样的状态行; 我不记得它是什么,确切地说,它不再存在,所以你可能不得不为不同情况修改它.我认为表达式分组可能是GNU特有的功能,所以如果你不使用gnutils,你可能需要添加多grep -v
行.
将文件传递给git rm
.
现在将它粘贴在shell别名中......
如上所述
git add -u
将删除的文件分阶段删除,但也修改了文件以进行更新.
要取消暂存已修改的文件,您可以执行此操作
git reset HEAD
如果你想保持你的提交有条不紊和干净.
注意:这也可能会删除已删除的文件,因此请小心使用这些通配符.