【问题标题】:Stage only deleted files with git add仅使用 git add 暂存已删除文件
【发布时间】:2017-08-26 22:44:21
【问题描述】:

我已经运行git status 并看到几个修改的文件和几个删除的文件。

是否可以仅暂存已删除或仅修改的文件?

【问题讨论】:

  • git status 还告诉您如何暂存和取消新/修改/删除的文件。

标签: git git-add git-stage


【解决方案1】:

如果您混合了已修改和已删除的文件,并且只想将已删除的文件暂存到索引中,则可以使用 git ls-files 作为过滤器。

git ls-files --deleted | xargs git add

如果您只想将此应用于文件树的一部分,请将一个或多个子目录作为参数提供给ls-files

git ls-files --deleted -- lib/foo | xargs git add

要仅对修改后的文件执行相同操作,请使用 --modified (-m) 选项而不是 --deleted (-d)。

【讨论】:

  • 如果删除的文件名中包含空格,则应将参数-d "\n" 传递给xargs。
  • 您也可以将git ls-files -z --deleted | xargs -0 git add 用于带有特殊字符(甚至是换行符)的文件名。
  • 感谢 steve - 文件名中的特殊字符和空格
  • 如果您想将此作为别名添加到 .gitconfig,这里有一个警告:您必须将命令字符串化并在其前面加上 ! 前缀,如下所示:sd = !"git ls-files --deleted | xargs git add"
  • 要考虑文件名中的空格,请使用git ls-files --deleted | xargs -d '\n' git add --all
【解决方案2】:

@steve 的答案相同,但添加了一些变化:

在命令末尾添加--all,将ls-files命令返回的所有文件都添加到索引中

git ls-files --deleted | xargs git add --all

【讨论】:

    【解决方案3】:

    对于 PowerShell

    git ls-files --deleted | % {git add $_}
    

    【讨论】:

      【解决方案4】:

      对于所有的爱ls-files 来这里,在我看来

      git add --all $(git diff --diff-filter=D --name-only)
      

      更直接。

      【讨论】:

        【解决方案5】:

        另一种方式:

        git diff --name-only --diff-filter=D | sed 's| |\\ |g' | xargs git add
        

        我在这里使用sed,因为路径可能包含空格字符。

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 2012-03-24
          • 2012-09-04
          • 2014-09-14
          • 2010-12-03
          • 2011-05-14
          • 1970-01-01
          相关资源
          最近更新 更多