关于git:只添加未经跟踪的文件

Adding Only Untracked Files

我在Git中发现一个非常有用的命令是git add -u,它可以将除未跟踪文件以外的所有文件都抛出到索引中。有没有相反的情况?在过去的几个月里,我经常发现自己处于这样的境地:我已经交互地向索引添加了一些更新,并且我想在提交之前将所有未跟踪的文件添加到索引中。

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

谢谢。


使用git add -i很容易。键入a(表示"添加未跟踪"),然后键入*(表示"全部"),然后键入q(表示退出),就完成了。

用一个命令来完成:echo -e"a
*
q
"|git add -i


git ls-files -o --exclude-standard提供了未跟踪的文件,因此您可以执行如下操作(或添加别名):

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


不完全是你想要的,但我觉得这很有帮助:

1
git add -AN

将所有文件添加到索引,但不添加其内容。未跟踪的文件现在表现得好像被跟踪了一样。它们的内容将显示在git diff中,然后可以与git add -p交互添加。


您可以将此添加到~/.gitconfig文件中:

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

然后,从命令行运行:

1
git add-untracked


人们曾建议通过管道将git ls-files的输出发送到git add,但如果文件名包含空格或全局字符(如*),则会失败。

安全的方法是使用:

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

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


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

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

要在树中添加所有未跟踪的文件,请执行以下操作:

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


我试过了,结果成功了:

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

git stash只将所有修改过的跟踪文件放在单独的堆栈中,剩下的文件是未跟踪的文件。然后,通过这样做,git add .将根据需要准备所有未跟踪的文件。最后,通过执行git stash pop从堆栈中返回所有修改的文件。


这里有很多好的提示,但在PowerShell中,我无法让它工作。

我是一个.NET开发人员,我们主要使用Windows操作系统,因为我们没有那么多地使用.NET核心和跨平台,所以我对Git的日常使用是在Windows环境中,在Windows环境中使用的shell通常是PowerShell,而不是Git Bash。

可以按照以下过程创建一个别名函数,用于在Git存储库中添加未跟踪的文件。

在PowerShell的$profile文件中(如果丢失-可以运行:新项目$profile)

记事本$profile

现在添加此PowerShell方法:

1
2
3
function AddUntracked-Git() {
 &git ls-files -o --exclude-standard | select | foreach { git add $_ }
}

保存$profile文件并将其重新加载到PowerShell中。然后重新加载$profile文件:. $简介

这类似于*nix环境中的source命令imho。

所以下一次,如果你是开发人员,在Windows中针对git repo使用PowerShell并且只想包括可以运行的未跟踪文件:

添加未跟踪的git

这遵循PowerShell约定,其中包含动词名词。


如果您有数千个未跟踪的文件(呃,不要问),那么添加*时,git add -i将不起作用。您将得到一个说明Argument list too long的错误。

如果您也在Windows上(不要问2:-)并且需要使用PowerShell添加所有未跟踪的文件,则可以使用以下命令:

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


添加所有未跟踪的文件git命令是

git add -A

另外,如果要获得有关各种可用选项的详细信息,可以键入command

git add -i

使用此命令,您将获得更多选项,包括添加所有未跟踪文件的选项,如下所示:

$ git add -i warning: LF will be replaced by CRLF in README.txt. The
file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in package.json.

* Commands * 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8:
help What now> a