Git:只列出“untracked”;文件(也包括自定义命令)

有没有办法使用像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命令?

198309 次浏览

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

git clean -df

如果你还想包含被特别忽略的文件,可以添加x。我一整天都在使用git clean -dfx很多

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

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

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

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

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

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

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

编辑:参考:git-ls-files

被接受的答案会在有空格的文件名上崩溃。我在这一点上不确定如何更新alias命令,所以我将把改进的版本放在这里:

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

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

我认为这和最初海报的意图是一样的:

git add .

补充一些注意事项:

  • 你已经运行git status并确认你的本地目录是干净的
  • 你已经在git status中报告的每个文件上运行了git diff,并确认你的更改是干净的
  • 您的更改包含了自动化的单元测试
  • 您的更改包含了自动化集成测试
  • 您已经通过调试器运行集成测试,通过白盒观察运行中的新代码来验证新行为
  • 您已经运行了所有检测/代码约定规则,它们通过了
  • 您已经运行了所有单元测试,并且它们都通过了
  • 您已经运行了所有本地集成测试,并且它们都通过了
  • 您已经将更改部署到应用程序审查环境中,并在与其他更改隔离的情况下手动测试了它们
  • 您已经从主分支合并了最新的内容,并重新运行了所有自动化的单元和集成测试,修复了所有合并冲突和测试失败

现在,我的朋友,你准备git add .有罪不罚。

一切都很简单

使用选择< em > - u < / em >(——untracked-files)获取所有未跟踪文件的列表

git status -u

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

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

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

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

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

你可以使用git clean操作-n(演练)来显示它将删除哪些文件(包括.gitignore文件):

git clean -xdn

这样做的好处是显示不被跟踪的所有文件所有文件夹。参数:

  • x -显示所有未跟踪的文件(包括被git忽略的文件和其他文件,如构建输出等…)
  • d显示未跟踪的目录
  • n -和大多数重要的是! -干运行,即实际上不删除任何东西,只是使用清洁机制来显示结果。

这样做可能有点不安全,以防你忘记-n。所以我通常在git配置中使用别名。

我检查的所有之前的答案也会列出要提交的文件。 列表中还没有的文件是一个简单的解决方案

. repo且不受.gitignore的约束
git status --porcelain | awk '/^\?\?/ { print $2; }'

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