2011-09-16 64 views
117

我在Git中发现的一个令人难以置信的命令是git add -u,它将除了未跟踪文件之外的所有内容都放入索引中。有没有反过来?在过去的几个月中,我经常发现自己处于一种交互式添加索引更新的位置,我希望在提交之前将所有未跟踪的文件添加到该索引。仅添加未跟踪文件

有没有办法只将添加到未跟踪的文件到索引而不单独标识它们?我在帮助文档中看不到任何明显的内容,但也许我错过了它?

谢谢。

+1

关于“将所有未处理的文件都扔入索引中”,“.gitignore”专门为此目的而设计,而不是'git add -u'。 – Pacerier

+0

另外,你是否要求在删除所有当前跟踪的文件的同时添加未跟踪的文件,或者你是否要求在当前跟踪的文件的顶部**添加未跟踪的文件**(使所有事件都被跟踪)? – Pacerier

回答

162

这很容易与git add -i。键入a(对于“添加未跟踪”),然后*(对于“全部”),然后q(退出),完成。

要使用一个命令做到这一点:echo -e "a\n*\nq\n"|git add -i

+3

我希望有更少的东西,好,互动,但它肯定比档案文件更好。 :-) –

+28

@回声-e“a \ n * \ nq \ n”| git add -i' – Mat

+1

@Mat我来完成这个完全自动化,就像上面的评论。谢谢。 –

23

git ls-files -o --exclude-standard给未跟踪文件,所以你可以这样做以下(或添加一个别名的话):

git add $(git ls-files -o --exclude-standard) 
+1

alias gau =“git ls-files -o --exclude-standard | xargs -i git add'{}'”适合我 – Stephan

+0

git ls-files --help相当有用阅读: '-o,--others' '在输出中显示其他(即未跟踪的)文件' –

8

您可以将它添加到你的〜/的.gitconfig文件:

[alias] 
    add-untracked = !"git status --porcelain | awk '/\\?\\?/{ print $2 }' | xargs git add" 

然后,在命令行,只需要运行:

git add-untracked 
+0

我喜欢这种方法,但它不处理文件名中的空格。 –

9

不是您要寻找什么,但我发现这非常有用:

git add -AN 

将所有文件添加到索引,但没有他们的内容。现在未被跟踪的文件现在就像被跟踪一样。他们的内容将显示在git diff中,然后您可以与git add -p交互式添加。

2

git ls-files列出当前目录中的文件。如果你想从树中的任何位置列出未跟踪文件,这可能会更好地工作:

git ls-files -o --exclude-standard $(git rev-parse --show-toplevel) 

要添加树中的所有未跟踪文件:

git ls-files -o --exclude-standard $(git rev-parse --show-toplevel) | xargs git add 
+0

不知道为什么这是唯一的工作,但它是,谢谢 – slackbot39243

-3

要添加的所有未跟踪文件 混帐命令

混帐添加-A

此外,如果你想获得各种可用选项的详细信息,您可以键入命令

混帐添加-i

,而不是第一个命令,这个你会得到更多的选择,包括选择添加所有未跟踪的文件如下所示:

$ git add -i warning:LF将被README.txt中的CRLF替换。 文件将在其工作目录中具有其原始行尾。 警告:LF将被package.json中的CRLF所取代。

*命令* 1:状态2:更新3:回复4:添加未经跟踪的5块6:DIFF 7:退出8: 帮助现在什么>一个

8

人建议通过管道将输出git ls-filesgit add,但是如果文件名包含空格或水平字符(例如*),则会失败。

的安全的方式是使用:

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

其中-z告诉混帐使用\0行结束符和-0告诉xargs的相同。这种方法的唯一缺点是-0选项是非标准的,因此只有某些版本的xargs支持它。

0

如果您有成千上万的未跟踪文件(唉,不要问),那么当添加*时,git add -i将不起作用。您将收到一条错误消息,说明Argument list too long

如果随后也使用的是Windows(不要问#2 :-),需要使用PowerShell添加所有未跟踪文件,你可以使用这个命令:

git ls-files -o --exclude-standard | select | foreach { git add $_ } 
0

我想这和它工作:

git stash && git add . && git stash pop 

git stash只能将所有修改过的跟踪文件到独立的堆栈,然后剩余的文件是未跟踪文件。然后通过git add .将要求的所有文件未跟踪文件。最后,从堆栈中获取所有已修改文件的集合git stash pop