Git:仅列出"未跟踪"文件(也是自定义命令)

jny*_*len 322 git git-status git-stage git-ls-files git-rm

有没有办法使用命令git ls-files,只显示未跟踪的文件?

我问的原因是因为我使用以下命令来处理所有已删除的文件:

git ls-files -d | xargs git rm
Run Code Online (Sandbox Code Playgroud)

对于未跟踪的文件,我想要类似的东西:

git some-command --some-options | xargs git add
Run Code Online (Sandbox Code Playgroud)

我能够找到-o选项git ls-files,但这不是我想要的,因为它也显示了被忽略的文件.我还能够提出以下长而丑陋的命令:

git status --porcelain | grep '^??' | cut -c4- | xargs git add
Run Code Online (Sandbox Code Playgroud)

似乎我必须在这里使用更好的命令.如果没有,我如何创建自定义git命令?

tak*_*hin 506

要列出未跟踪的文件,请尝试:

git ls-files --others --exclude-standard
Run Code Online (Sandbox Code Playgroud)

如果你需要输出到输出xargs,那么使用git ls-files -z和思考空格是明智的xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add
Run Code Online (Sandbox Code Playgroud)

添加未跟踪文件的好别名:

au = !git add $(git ls-files -o --exclude-standard)
Run Code Online (Sandbox Code Playgroud)

编辑:供参考:git-ls-files

  • @jnylen:`!`运行bash命令,所以你可以使用`$(...)` (14认同)
  • 完善!`!`在别名行的开头是什么意思,或者记录在哪里? (6认同)
  • @WeAreAllMonica 这是放入 .gitconfig 中的别名。所以 !表示在子 shell 中运行命令。 (4认同)
  • 在什么情况下你需要别名?`git add*`将做同样的事情:添加除标准之外的所有未跟踪文件(文件的路径被`.gitignore`覆盖). (2认同)
  • 我更喜欢我的别名在 repo 的所有目录中一致地工作(ls-files 命令只显示当前树中更改的文件),所以我有 `[alias] lso = "!f() { cd $(git rev-解析 --show-toplevel); git ls-files -o; }; f"` (2认同)

Dus*_*tin 70

如果您只想删除未跟踪的文件,请执行以下操作:

git clean -df
Run Code Online (Sandbox Code Playgroud)

x如果您还想包含特别忽略的文件,请添加到该文件中.我用git clean -dfx一个很多全天.

您可以通过编写一个被调用的脚本git-whatever并将其放在路径中来创建自定义git .

  • 只需要`git add -A`或`git add -u`(取决于哪个对你更有意义) (5认同)
  • 和“git clean -dfxn”通过添加“n”进行试运行 (2认同)

小智 48

git add -A -n会做你想做的.-A将所有未跟踪文件到回购,-n使得它dry-run不执行附加,但被赋予状态输出列出每个文件被添加.

  • 这是一个很好的答案!请注意,它会排除`.gitignore`文件中的文件,这通常是我们想要的,但如果没有,`git add -fAn`. (6认同)
  • 它还列出了修改过的文件。 (2认同)
  • 很好,但我把它包装起来了:`add '$file'`。而 `git ls-files --exclude-standard -o` 给出了一个裸露的输出,非常热。 (2认同)
  • 只是明确地说:这不是寻找的答案。原始发布者正在寻找不带任何装饰字符的裸文件名(以便通过其他命令处理它们),并且也不显示修改后的文件。 (2认同)

you*_*ayy 27

接受的答案在带有空格的文件名上崩溃.我无法评论它(到目前为止的stackoverflow得分低),而我现在还不确定如何更新alias命令,所以我将把改进的版本放在这里:

git ls-files -z -o --exclude-standard | xargs -0 git add
Run Code Online (Sandbox Code Playgroud)


小智 25

一切都很简单

要获取所有未跟踪文件的列表,请使用命令git status选项-u( - untracked-files)

git status -u
Run Code Online (Sandbox Code Playgroud)

  • 这是在初始提交时显示我被忽略的文件的唯一答案,但是我必须在`git status -u`命令中添加`--ignored` (8认同)
  • 这*还*显示修改过的文件。因此,这不是问题的答案:*仅*显示未跟踪的文件。 (6认同)

cod*_*der 9

我知道这是一个老问题,但在列出未跟踪的文件方面,我想我会添加另一个也列出未跟踪文件夹的文件:

您可以将 git clean 操作与 -n (dry run) 一起使用,以通过以下方式向您显示它将删除的文件(包括 .gitignore 文件):

git clean -xdn

这具有显示所有文件所有未跟踪的文件夹的优点。参数:

  • x - 显示所有未跟踪的文件(包括被 git 和其他人忽略的文件,如构建输出等...)
  • d - 显示未跟踪的目录
  • n- 最重要的是!- 空运行,即实际上不删除任何内容,只需使用清理机制来显示结果。

这样做可能有点不安全,以防您忘记-n. 所以我通常在 git config 中给它起别名。


Fra*_*fer 9

我之前检查过的所有答案都会列出要提交的文件。这是一个简单易用的解决方案,仅列出尚未在存储库中且不受.gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'
Run Code Online (Sandbox Code Playgroud)

或者

git status --porcelain | grep -v '\?\?'
Run Code Online (Sandbox Code Playgroud)


小智 6

在寻找可能添加的文件时.输出可以git show做到这一点,但它还包括很多其他的东西.以下命令对于获取相同的文件列表非常有用,但没有其他所有内容.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'
Run Code Online (Sandbox Code Playgroud)

当在管道中组合以查找与特定模式匹配的文件然后将其连接到时,这非常有用git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add
Run Code Online (Sandbox Code Playgroud)