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


339

有没有办法使用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 ls-files -d | xargs git rm吗?
Takehin 2010年

这将删除所有git通知丢失的文件。我的问题是有关如何执行相关操作的-添加git当前未跟踪的所有文件。我通常会在重命名,合并和/或拆分我的代码文件之后执行全部这两项操作。
我们都是莫妮卡2010年

如果他们不见了,那不是已经删除了吗?除非...您从其他地方拉过来,然后尝试与远程同步...我想我明白了。
Buttle Butkus 2015年

我已经测试了所有答案,如果没有空的未跟踪文件夹,没有人可以找到它。
kittygirl '19

@kittygirl这是正确的。由于git仅适用于文件,因此它无法跟踪空文件夹。试试吧find . -type d -empty
我们都是莫妮卡

Answers:


529

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

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


7
完善!!别名行开头的意思是什么,或者在哪里记录?
我们都是莫妮卡(Monica),2010年

@takeshin如何仅获取父目录名称?不是子文件夹。这些未跟踪的文件中的意思是:/ P / a / files,/ P / a / images,/ P / a / / P
/,...-

2
在什么情况下您需要别名?git add *会做同样的事情:添加除标准外的所有未跟踪文件(其路径包含在中的文件.gitignore)。
toinetoine

1
我希望别名能够在[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
仓库

谢谢。好评论。
Darth Egregious

71

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

git clean -df

添加x到,如果你想也包括专门忽略的文件。我用git clean -dfx一个很多全天。

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


我想添加所有未跟踪的文件(例如,在我移动一些东西之后)的情况更为常见。无论如何,感谢您提供有关自定义命令的提示。该机制记录在哪里?
我们都是莫妮卡2010年

5
git add -A还是git add -u((取决于哪个对您来说更有意义)
Dustin

1
您的评论是真正的答案,这也是由@Mike Lococo后重复
andho

2
和“ git clean -dfxn”通过添加“ n”进行

50

git add -A -n会做你想要的。-A将所有未跟踪的文件添加到存储库中,-n使其成为dry-run不执行添加操作的位置,但会给出状态输出,列出添加的每个文件。


7
这是一个很好的答案!请注意,它会排除文件中的.gitignore文件,这通常是我们想要的,如果不是,则为git add -fAn
cdunn2001 2013年

1
这似乎是最好的答案。
罗伯·格兰特

1
这是最好的答案。它明确告诉用户它会做什么(不做),并有机会在实际添加它之前对其进行检查。完善。谢谢!
digitguy

它还列出了修改后的文件。
Frank-ReneSchäfer18年

不错,但是我把它包裹了:add '$file'。而git ls-files --exclude-standard -o给出的输出却很少,管道很热。
pal

28

接受的答案在带有空格的文件名上崩溃。我现在不确定如何更新alias命令,因此将改进后的版本放在这里:

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

我认为这是正确的答案,因为它提供了随后每个文件对它们执行操作(如git add)的路径
Pablo Burgos

27

一切都很简单

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

git status -u

非递归版本呢?
戴维

不幸的是,它也列出了通过.gitignore文件忽略的文件。
Plouff '16

8
这是表现出对初始提交我忽略的文件唯一的答案,但我不得不添加--ignoredgit status -u命令
DN

这很简单也很不错。
Eric Wang

1
显示了修改后的文件。因此,不能回答这个问题:显示未跟踪的文件。
通配符'18

6

在寻找可能添加的文件时。这样做的结果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

6

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

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

git clean -xdn

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

  • x -显示所有未跟踪的文件(包括git等忽略的文件,例如build输出等)
  • d -显示未跟踪的目录
  • n-最重要的是!-dryrun,即实际上不删除任何内容,只需使用clean机制显示结果即可。

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


2

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

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

要么

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

这似乎不适用于名称中带有空格的文件
ssc

-2

我认为这与原始海报的意图是一样的:

git add .


2
每次这样做git/svn add .,小猫都会死亡。
Nakilon 2013年

嘿,只有当您在远程分支机构的本地副本中有一堆残骸时,才可以;)建立本地分支机构,您可以git add .不受惩罚!
Tim Fulmer

@Nakilon,这就是您.gitignore正确配置的原因。不过,还是要避免git add .。更好的是git add -u
通配符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.