首页 文章

从已从磁盘中删除的Git存储库中删除多个文件

提问于
浏览
1267

我有一个Git repo,我已经删除了使用 rmnot git rm )的四个文件,我的Git状态如下所示:

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

如何从Git中删除这些文件,而无需手动浏览并添加如下所示的每个文件:

git rm file1 file2 file3 file4

理想情况下,我正在寻找与 git add . 相同的方式,如果可能的话 .

29 回答

  • 92

    添加系统别名以暂存已删除的文件作为命令 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 .

  • 1

    (另一种变化)

    我想删除所有已经从磁盘文件中删除但从一个特定文件夹中删除的文件,而不保留其他文件夹 . 以下对我有用:

    git ls-files --deleted  | grep <folder-name> | xargs git rm
    
  • 38
    git rm $(git ls-files -d)
    

    删除 git ls-files 命令列出的所有文件(-d仅显示已删除的文件) . 不适用于文件名或路径中包含空格的文件,但很容易记住

  • 2254

    适用于visual studio项目

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

    当删除的文件路径有空格时很有用

  • 4

    我迄今发现的最灵活的解决方案是

    git cola
    

    并选择我想要暂存的所有已删除文件 .

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

  • 2

    即使您有大量要处理的文件,以下内容也可以使用:

    git ls-files --deleted | xargs git rm
    

    您可能还想提交评论 .

    有关详细信息,请参阅:Useful Git Scripts

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

    在我删除了文件后,这对我有用 .

  • 355

    我需要相同的并使用git gui“stage changed”按钮 . 它还增加了所有 .

    在“阶段改变”后,我做了“提交”......

    所以我的工作目录又干净了 .

  • 1

    您可以使用 git add -u <filenames> 仅暂存已删除的文件 .

    例如,如果删除了文件 templates/*.tpl ,则使用 git add -u templates/*.tpl .

    需要 -u 才能引用存储库中存在但工作目录中不再存在的文件 . 否则, git add 的默认值是查找工作目录中的文件,如果指定文件,则've deleted there, it won't找不到它们 .

  • 3

    对于Git 1.x

    $ git add -u
    

    这告诉git自动暂存跟踪的文件 - 包括删除以前跟踪的文件 .

    对于Git 2.0

    分阶段整个工作树:

    $ git add -u :/
    

    仅仅暂存当前路径:

    $ git add -u .
    
  • 1
    git ls-files --deleted -z | xargs -0 git rm
    

    可能是你在找什么..它对我有用..

  • 19

    您可以使用

    git add -u
    

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

    git commit -m "Deleted files manually"
    
  • 15

    就像是

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

    可能会这样做 .

  • 48

    如果您只是运行:

    git add -u
    

    git将更新其索引,以便知道您删除的文件实际上应该是下一次提交的一部分 . 然后你可以运行“git commit”来检查那个变化 .

    或者,如果您运行:

    git commit -a
    

    它将自动进行这些更改(以及任何其他更改)并提交它们 .

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

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

    你可能正在寻找-A:

    git add -A
    

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

  • 29

    仅暂存已删除的文件:

    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
    

    您可以alias首选命令集,以方便以后使用 .

  • 0
    git rm test.txt
    

    删除实际文件之前或之后 .

  • 6

    通过使用带有'--all'或'--update'选项的git-add,您可能会得到比您想要的更多 . 新的和/或修改过的文件也将添加到索引中 . 我有一个bash别名设置,当我想从git中删除已删除的文件而不触及其他文件时:

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

    已从文件系统中删除的所有文件都将添加到已删除的索引中 .

  • 14

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

    git add -u
    

    ...如果已删除工作树中的相应文件,将从索引中删除文件,但它也会暂存已修改的跟踪文件的新内容 .

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

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

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

  • 5

    如果这些是唯一的变化,你可以简单地做

    git commit -a
    

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

  • -1
    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.
    
  • 728

    git add -u

    -u --update仅匹配索引中已跟踪的文件而不是工作树 . 这意味着它永远不会暂存新文件,但它会暂存已修改的跟踪文件的新内容,并且如果已删除工作树中的相应文件,它将从索引中删除文件 .

    如果没有,则默认为“ . ”;换句话说,更新当前目录及其子目录中的所有跟踪文件 .

  • 61

    这个简单的解决方案适合我:

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

    如果你想将它添加到 .gitconfig ,请执行以下操作:

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

    然后你要做的就是运行:

    git rma
    
  • 8
    git ls-files --deleted -z | xargs -0 git rm --cached
    

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

    根据您的POSIX变体,您可能需要使用 xargs -0 -r :这将导致 xargs 在管道空内容时正常退出 .

    编辑: --cached--deleted 标志串联使用,以防止意外删除尚未删除的文件 .

  • 1

    试试吧 .

    -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"
    
  • 6

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

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

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

    git-add的所有标志都不会仅删除已删除的文件;如果您修改了所有已删除的文件,那么您没问题,但除此之外,您需要运行git-status并解析输出 .

    根据Jeremy的回答,这就是我得到的:

    git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
    
    • 获取文件状态 .

    • 对于已删除的文件,请隔离文件的名称 .

    • 删除所有以#开头的行,以及包含单词"deleted"的状态行;我不再那么久了,所以你可能必须针对不同情况对其进行修改 . 我认为表达式分组可能是GNU特有的功能,所以如果你不使用gnutils,你可能需要添加多个 grep -v 行 .

    • 将文件传递给 git rm .

    现在将它粘贴在shell别名中......

  • 10

    如上所述

    git add -u
    

    将删除的文件分阶段删除,但也修改了文件以进行更新 .

    要取消暂存已修改的文件,您可以执行此操作

    git reset HEAD <path>
    

    如果你想保持你的提交有条不紊和干净 .
    NOTE: 这也可能会删除已删除的文件,因此请小心使用这些通配符 .

相关问题