从Git仓库中删除已经从磁盘删除的多个文件
我有一个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 .
如果可能的话。
对于Git 1.x
$ git add -u
这告诉git自动登台跟踪文件 – 包括删除以前跟踪的文件。
对于Git 2.0
要整个工作树:
$ 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
命令(尽pipe移动检测是自动的)。
只阶段删除的文件:
for x in `git status | grep deleted | awk '{print $3}'`; do git rm $x; done
或(xargs方式):
git status | awk '/deleted/ {print $3}' | xargs git rm
您可以别名您的首选命令集以方便以后使用。
git rm test.txt
在删除实际文件之前或之后。
通过使用git-add与“–all”或“–update”选项,你可能会得到比你想要的更多。 新的和/或修改的文件也将被添加到索引。 我有一个bash别名设置,当我想删除从git中删除的文件,而无需触及其他文件:
alias grma='git ls-files --deleted -z | xargs -0 git rm'
从文件系统中删除的所有文件都被删除后添加到索引中。
这不是真的很重要,但我不同意所选的答案:
git add -u
…如果工作树中的相应文件已被删除,则将从索引中删除文件,但是它也将暂存修改的被跟踪文件的新内容。
git rm $(git ls-files --deleted)
另一方面只会删除被追踪的已删除文件。
所以后者在我看来是更好的select。
如果这些是唯一的变化,你可以简单的做
git commit -a
提交所有更改。 这将包括删除的文件。
git ls-files --deleted | xargs git rm
是仅添加已删除文件的最佳select。
这里有一些其他的select。
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只匹配已经跟踪的索引文件而不是工作树。 这意味着它永远不会展示新文件,但是它将逐步修改被跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。
如果没有,默认为“。”; 换句话说,更新当前目录及其子目录中的所有跟踪文件。
这个简单的解决scheme适用于我:
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
在pipe道空内容时正常退出。
编辑: – --cached
和 – 删除标志串联使用,以防止意外删除尚未被删除的文件。
尝试一下。
-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并parsing输出。
根据杰里米的回答,这是我得到的:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
- 获取文件的状态。
- 对于已删除的文件,请隔离文件的名称。
- 删除所有以#开头的行,以及删除了“删除”一词的状态行; 我不记得那是什么东西,确切地说,现在已经不存在了,所以你可能需要对不同的情况进行修改。 我认为expression式的分组可能是一个GNU特有的function,所以如果你不使用gnutils,你可能需要添加多个
grep -v
行。 - 将文件传递给
git rm
。
现在坚持在一个shell别名…
如上所述
git add -u
阶段删除的文件进行删除,但也修改文件进行更新。
取消修改的文件,你可以做
git reset HEAD <path>
如果你想保持你的承诺有组织和干净。
注意:这也可能会取消已删除的文件,请小心使用这些通配符。
即使您有很多文件需要处理,以下方法仍然有效:
git ls-files --deleted | xargs git rm
你可能也想要提交一个评论。
有关详细信息,请参阅: 有用的Git脚本
我需要相同的和使用git gui“舞台改变”button。 它也增加了所有。
而“阶段改变”后,我做了“承诺”…
所以我的工作目录再次清洁。
git commit -m 'commit msg' $(git ls-files --deleted)
我已经删除了这些文件后,这工作对我来说。
你可以使用git add -u <filenames>
来git add -u <filenames>
已删除的文件。
例如,如果您删除了文件templates/*.tpl
,则使用git add -u templates/*.tpl
。
-u
是必需的,以便引用存在于存储库中但不再存在于工作目录中的文件。 否则, git add
的默认值是在工作目录中寻找文件,如果你指定了在那里删除的文件,它将不会find它们。
就像是
git status | sed -s "s/^.*deleted: //" | xargs git rm
可以做到这一点。
对于视觉工作室项目
'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm'
这在删除的文件path有空格时很有用
为命令rm-all
添加暂存已删除文件的系统别名
UNIX alias rm-all='git rm $(git ls-files --deleted)'
WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"
注意
Windows需要安装bash
。
(又一变化)
我想删除所有已经从磁盘文件中删除,但从一个特定的文件夹,其他文件夹保持不变。 以下为我工作:
git ls-files --deleted | grep <folder-name> | xargs git rm
我发现迄今为止最灵活的解决scheme是
git cola
并select所有我想要删除的文件。
(注意,我通常在git中执行一切命令行,但是git处理移除的文件有点尴尬)。