是否可以使用git ls-files之类的命令仅显示未跟踪的文件?

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

git ls-files -d | xargs git rm


对于未跟踪的文件,我想要类似的东西:不是我想要的,因为它还会显示被忽略的文件。我还能够提出以下冗长而又丑陋的命令:如果没有,如何创建自定义git命令?

评论

您能否详细说明为什么需要git ls-files -d | xargs git rm?

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

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

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

@kittygirl这是正确的。由于git仅适用于文件,因此它无法跟踪空文件夹。尝试查找。 -类型d-空。

#1 楼

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

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


如果需要将输出通过管道传输到xargs,则最好使用git ls-files -zxargs -0注意空格: br />
git ls-files -z -o --exclude-standard | xargs -0 git add


用于添加未跟踪文件的别名:

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


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

评论


完善!什么!是指别名行的开头,还是记录在哪里?

–我们都是莫妮卡
2010-09-27 6:31

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

–.jacky博士
16年7月16日在11:05

在什么情况下您需要别名? git add *将执行相同的操作:添加除标准外的所有未跟踪文件(路径的文件包含在.gitignore中)。

–toinetoine
17年7月12日在12:04

我希望别名能够在仓库中的所有目录中保持一致(ls-files命令仅显示当前树中已更改的文件),所以我有[alias] lso =“!f(){cd $(git rev-parse --show-toplevel); git ls-files -o;}; f“

– qneill
17-10-12在15:02

谢谢。好评论。

–黑暗无耻
18年7月16日在15:18

#2 楼

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

git clean -df


如果要还包括专门忽略的文件,请添加x。我一整天都在使用git clean -dfx

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

评论


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

–我们都是莫妮卡
2010-09-27 6:27



只需执行git add -A或git add -u(取决于哪种方法对您更有意义)

–达斯汀
2010-09-27 17:34

您的评论是真实的答案,稍后@Mike Lococo也会重复

– andho
17年4月4日在11:57

和“ git clean -dfxn”以添加“ n”进行空运行

– charo
18年2月17日在13:05

#3 楼

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

评论


这是一个很好的答案!请注意,它不包括.gitignore文件中的文件,这通常是我们想要的,如果不是,则使用git add -fAn。

– cdunn2001
13年6月29日在20:32

这似乎是最好的答案。

–Rob Grant
16年8月16日在9:08

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

– Digiguy
17年6月8日在17:41

它还列出了修改后的文件。

–弗兰克·雷恩·谢弗(Frank-ReneSchäfer)
18年2月2日在12:22

很好,但是我把它包装了:添加'$ file'。而git ls-files --exclude-standard -o给出了一个裸露的输出,滚烫。

–高pal
19年8月16日在5:23

#4 楼

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

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


评论


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

– Pablo Burgos
18-11-22在15:29

#5 楼

一切都很简单

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

git status -u


评论


非递归版本呢?

–大卫
2015年6月10日15:27

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

–蓬松
16 Mar 1 '16 at 9:31

这是在初始提交时显示我忽略的文件的唯一答案,但是我必须在git status -u命令中添加--ignored

– D.N.
17-2-27在19:18

这很简单也很不错。

–王E
18年8月24日在11:07

这也显示了修改后的文件。因此,不能回答这个问题:只显示未跟踪的文件。

–通配符
'18 Sep 12'在1:10

#6 楼

我知道这是一个老问题,但就列出未跟踪文件而言,我想我会再添加一个列出未跟踪文件夹的文件:通过以下方法显示将删除的文件(包括.gitignore文件):

git clean -xdn

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



x-显示所有未跟踪的文件(包括git等忽略的文件,例如生成输出等)。

d-显示未跟踪的目录

n-最重要的是! -dryrun,即实际上不删除任何内容,只需使用clean机制显示结果即可。

这样做会有些不安全,以防万一您忘记了-n。因此,我通常在git config中对其进行别名。

评论


为什么git输出是如此令人讨厌的可读性?提议的答案在每个文件名之前都会打印“ Would remove”,因此如果没有进一步grepping的话,就不能用于OP的用例。

–fieres
10月30日10:54

#7 楼

在寻找可能添加的文件时。 git show的输出可以做到这一点,但它还包含许多其他内容。以下命令可用于获取相同的文件列表,但不包含所有其他内容。特定样式,然后将其管道输送到git add

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


#8 楼

我检查过的所有以前的答案也会列出要提交的文件。 />
git status --porcelain | awk '/^\?\?/ { print ; }'




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


评论


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

–ssc
5月4日12:24

#9 楼

我认为这与原海报意图相同:

git add .

评论


每次执行git / svn add。时,小猫都会死亡。

– Nakilon
2013年6月6日15:28



嘿,仅当您在远程分支的本地副本中有一堆碎片时才可以;)创建本地分支,然后可以git add。有罪不罚!

–蒂姆·富尔默(Tim Fulmer)
13年7月11日在22:19

@Nakilon,这就是您正确配置.gitignore的原因。避免git add。仍然很好。更好的是git add -u。

–通配符
18/09/12在1:11