是否有一种方法可以使用像git ls-files这样的命令来只显示未跟踪的文件?

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

git ls-files -d | xargs git rm

我想要一些类似的未跟踪文件:

git some-command --some-options | xargs git add

我能够找到-o选项git ls-files,但这不是我想要的,因为它还显示被忽略的文件。我还想出了下面这个又长又丑的命令:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

看来这里还有更好的命令可以用。如果没有,我如何创建自定义git命令?


当前回答

git add -A -n会做你想做的。-A将所有未跟踪和修改的文件添加到repo, -n使其成为一个演练,其中添加不执行,但给出的状态输出列出了将被添加的每个文件。

其他回答

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

git clean -df

如果您还想包含特别忽略的文件,则在此基础上添加x。我一整天都在使用git clean -dfx。

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

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

git ls-files --others --exclude-standard

如果你需要将输出管道到xargs,明智的做法是使用git ls-files -z和xargs -0来注意空格:

git ls-files -z -o --exclude-standard | xargs -0 git add

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

au = !git add $(git ls-files -o --exclude-standard)

编辑:参考:git-ls-files

git add -A -n会做你想做的。-A将所有未跟踪和修改的文件添加到repo, -n使其成为一个演练,其中添加不执行,但给出的状态输出列出了将被添加的每个文件。

我检查的所有以前的答案也会列出要提交的文件。 列表中还没有的文件是一个简单的解决方案 回购和不受。gitignore。

git status --porcelain | awk '/^\?\?/ { print $2; }'

or

git status --porcelain | grep -v '\?\?'

当寻找可能添加的文件时。git的输出显示了这一点,但它还包括许多其他东西。下面的命令对于获得相同的文件列表很有用,但不需要其他所有东西。

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

这在管道中组合时非常有用,可以找到匹配特定模式的文件,然后将其输送到git add中。

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add