【问题标题】:git: list new files onlygit:仅列出新文件
【发布时间】:2012-02-18 11:40:39
【问题描述】:

当我执行 git status 时,我会得到一个以 new file: 为前缀的文件列表。我怎样才能只得到这个列表?我想在一个小 shell 脚本中以一个简单的循环来处理这些文件。

【问题讨论】:

标签: git status


【解决方案1】:

您可以使用 git status --short 来获取文件列表。

【讨论】:

  • 这一点不容忽视。
  • OP询问如何获取git status输出的new file:的纯列表,只需获取他“普通文件名”,但是这个有一个额外的状态主角。
  • 太棒了!正是我想要的! git ls-files --others 不适合我。使用 git status --short,我可以用 grep 搜索“^??”。谢谢!
【解决方案2】:

我会使用类似git status --porcelain | grep "^A" | cut -c 4-

【讨论】:

  • 多年后,但这对我不再有效(git status 的输出可能已经改变)。 编辑: 呸。没有添加/提交它。经得起时间的考验!
【解决方案3】:

下面的命令不再给出预期的结果,我可能最初也犯了一些错误。请仔细检查您的输出和您正在使用的选项。尽管如此:使用 diff-filter 的基本原则应该仍然适用。

不要使用 grep 来解析 git 输出。 Git 几乎可以肯定内置了您正在寻找的东西(除非您想要真正高级的东西)。
您可以使用git diff 来显示更改。 --name-only 仅显示文件名。 --diff-filter=A 仅列出添加的文件。
如果您想查看已添加到索引中的新文件,请使用--cached,否则请忽略它。查看与HEAD 的差异。
命令如下所示:

git diff --name-only --diff-filter=A --cached # All new files in the index  
git diff --name-only --diff-filter=A          # All files that are not staged  
git diff --name-only --diff-filter=A HEAD     # All new files not yet committed

【讨论】:

  • 差异过滤器实际上是要走的路:)
  • 不幸的是,OP 不接受这个答案,因为在我看来,你是完全正确的。 :)
  • 三个命令中的第一个是正确的。第二个没有多大意义,因为文件仅在暂存时才被标记为“新”。第三个是错误的,因为它甚至没有列出索引中标记为“新”的文件。
  • @agemO,这曾经有效。不过我同意,现在这完全是废话。 (我在答案中添加了注释)
  • 我不知道为什么有人声称“第三个是错误的,因为它甚至没有列出索引中标记为“新”的文件”,但是截至今天,第三个命令对我来说非常有效,它回答了 OP 提出的确切问题——如何获取git status 输出的new file: 的纯列表,这就是我来这里的目的.
【解决方案4】:

与其解析“git status”的输出,用起来可能更优雅

git ls-files -o  --exclude-standard

git status 一样,ls-files 将产生相对于您当前工作目录的输出。

您可能希望包含--full-name 选项:

git ls-files -o  --exclude-standard --full-name

【讨论】:

  • OP 要求列出新文件,这个答案不需要任何其他程序将输出传送到。我在 mac 上发现 git diff 没有按预期使用过滤器,而这样做:)
  • 这显然是赢家。它适用于包含所有新文件的新目录。
  • 但是,请注意这不适用于子目录。我最终使用git diff 使我的脚本在存储库中的每个目录中工作:$ git diff --name-only --diff-filter=A HEAD
  • @AndreasSiegel,这是设计使然,因为遵循 ls-files 命令的行为通常更有帮助。由于该命令遵循接受限定参数的一般约定,因此您的别名的更好解决方案是按如下方式修改别名: git ls-files -o --exclude-standard --full-name -- @987654328 @
  • @AndreasSiegel,这是设计使然,因为遵循 ls-files 命令的行为通常更有帮助。由于该命令遵循接受限定参数的一般约定,因此您的别名的更好解决方案是按如下方式修改别名:`git ls-files -o --exclude-standard --full-name -- ``git rev -parse --show-toplevel```
【解决方案5】:

新文件列表或获取要添加到git的文件,可以使用git status和grep命令,如git status -s | grep ??

root@user-ubuntu:~/project-repo-directory# git status -s | grep ??
 ?? src/.../file1.js
 ?? src/.../file2.js
 ?? src/.../file3.js
 ....

【讨论】:

    【解决方案6】:
    git status | grep "new file:" | cut -c 14-
    
    git status | grep "modified:" | cut -c 14- 
    

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多