我有一个Git repo,我用rm(不是Git rm)删除了四个文件,我的Git状态是这样的:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

我如何从Git中删除这些文件,而不需要手动查看并添加每个文件,就像这样:

git rm file1 file2 file3 file4

理想情况下,我正在寻找与git添加的方式相同的东西。是的,如果可能的话。


你可以使用

git add -u

要将删除的文件添加到暂存区域,然后提交它们

git commit -m "Deleted files manually"

类似的

git status | sed -s "s/^.*deleted: //" | xargs git rm 

也许吧。


如果只有这些变化,您可以简单地这样做

git commit -a

提交所有更改。这将包括已删除的文件。


你可能在找-A:

git add -A

这类似于git add -u,但也添加新文件。这大致相当于hg的addremove命令(尽管移动检测是自动的)。


通过使用带有“——all”或“——update”选项的git-add,你可能会得到比你想要的更多的东西。新的和/或修改的文件也会被添加到索引中。我有一个bash别名设置,当我想从git中删除已删除的文件而不接触其他文件:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

从文件系统中删除的所有文件都作为已删除文件添加到索引中。


git-add的任何标志都不会只执行已删除的文件;如果所修改的都是已删除的文件,那么就没问题,但除此之外,还需要运行git-status并解析输出。

根据杰里米的回答,我得出了以下结论:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm

获取文件的状态。 对于已删除的文件,请隔离文件名。 删除所有以#s开头的行,以及包含“deleted”字样的状态行;我不记得具体是什么了,现在已经不存在了,所以你可能需要根据不同的情况修改这个。我认为表达式分组可能是特定于gnu的特性,因此如果不使用gnutils,则可能必须添加多个grep -v行。 将文件传递给git rm。

把这个放在一个shell别名现在…


对于Git 1.x

$ git add -u

这告诉git自动执行跟踪文件——包括删除之前跟踪的文件。

对于 Git 2.0

展示你的整个工作树:

$ git add -u :/

只执行当前路径:

$ git add -u .

git rm test.txt

在您删除实际文件之前或之后。


如果你简单地运行:

git add -u

Git将更新它的索引,以知道您已经删除的文件实际上应该是下一次提交的一部分。然后你可以运行“git commit”来检入这个更改。

或者,如果你运行:

git commit -a

它将自动接受这些更改(以及任何其他更改)并提交它们。

更新:如果您只想添加已删除的文件,请尝试:

git ls-files --deleted -z | xargs -0 git rm
git commit

git ls-files --deleted -z | xargs -0 git rm 

也许这就是你正在寻找的。这对我有用。


我也需要 并且使用了git GUI的“换台”按钮。 它还添加了all。

在“换台”之后,我做了“提交”…

这样我的工作目录又干净了。


只运行已删除的文件:

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 add -u

阶段删除文件删除,但也修改文件更新。

要取消已修改的文件,您可以执行

git reset HEAD <path>

如果你想保持你的提交有条理和干净。注意:这也可能取消已删除的文件,所以要小心那些通配符。


并不是说这真的很重要,但我不同意选择的答案:

git add -u 

... 如果工作树中的相应文件已被删除,则将从索引中删除文件,但它也将执行已修改的跟踪文件的新内容。

git rm $(git ls-files --deleted)

... 另一方面,将只rm已删除的文件被跟踪。

所以在我看来后者是更好的选择。


如果你想把它添加到你的.gitconfig中,这样做:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

然后你要做的就是跑:

git rma

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 cola

然后选择我想要执行的所有已删除文件。

(注意,我通常在git中执行命令行,但git处理删除的文件有点尴尬)。


您可以使用git add -u <filenames>来只执行已删除的文件。

例如,如果您删除了文件模板/*。然后使用git添加-u templates/*. Tpl。

需要使用-u来引用存在于存储库中但不再存在于工作目录中的文件。否则,git add的默认设置是在工作目录中查找文件,如果您指定已删除的文件,它将无法找到它们。


即使你有很多文件要处理,下面的方法也可以:

git ls-files --deleted | xargs git rm

您可能还希望提交注释。

详细信息请参见:有用的Git脚本


git ls-files --deleted -z | xargs -0 git rm --cached

这将删除所有之前被git跟踪的已删除文件,以及处理文件名中有空格的情况。

根据POSIX变量的不同,您可能需要使用xargs -0 -r:这将导致xargs在管道输出空内容时优雅地退出。

EDIT:——cached和——deleted标志一起使用,以防止意外删除尚未删除的文件。


对于visual studio项目

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

当删除的文件路径有空间时,哪个是有用的


作为rm-all命令添加暂存删除文件的系统别名

UNIX 别名rm-all='git rm $(git ls-files——deleted)'

窗户 Doskey rm-all=bash -c "git rm $(git ls-files——deleted)"

Note

Windows需要安装bash。


git commit -m 'commit msg' $(git ls-files --deleted)

在我已经删除了文件之后,这个方法对我有用。


Git add -u

- u - - -更新 只匹配索引中已经跟踪的文件,而不是工作树。这意味着它将永远不会运行新的文件,但是它将运行已修改的跟踪文件的新内容,并且如果工作树中的相应文件已被删除,它将从索引中删除文件。

如果给出了no,默认为".";换句话说,更新当前目录及其子目录中的所有跟踪文件。


告诉命令自动生成已修改和删除的文件,但未通知Git的新文件不受影响:

——一个 ——所有

git add . && git commit -m -a "Your commit"

or

git add --all && git commit -m "Your commit"

这个简单的解决方案对我来说很有效:

git rm $(git ls-files --deleted)

请使用-t查看实际正在运行的命令

我只是调整了Virender的答案来做同样的事情:

git ls-files --deleted -z | xargs -t -0 git rm

(另一种变化)

我想删除所有已经删除的磁盘文件,但从一个特定的文件夹,留下其他文件夹不变。下面的方法对我很有效:

git ls-files --deleted  | grep <folder-name> | xargs git rm

git rm $(git ls-files -d)

删除git ls-files命令列出的所有文件(-d show only deleted files)。不适用于文件名或路径中有空格的文件,但易于记忆


仅仅

git add . && git commit -m "the message for commit" && git push

从Repo中删除所有以.log结尾的文件,但不删除本地存储

Git ls-files | grep "\.log$"


首先使用该命令可以在Git中提交所有已删除的文件 Git add -u来执行删除的文件,然后使用Git commit -m "message"来提交更改,并附上描述提交的消息。git add命令中的-u标志将执行所有已删除的文件,以及工作目录中的任何其他更改。