git:仅将新文件添加到暂存区

10

当我有:

  • 脏工作目录,
  • 脏暂存区,
  • 并且我复制了一些新文件到项目中,

如何只暂存新增的文件?

git alias adduntracked=
8个回答

15

这个别名将会遵循你的忽略模式(内置的、全局的以及每个目录特定的,就像 git-ls-files --exclude-standard 命令的帮助文档中所描述的那样)。它将在你的树的顶层运行。

[alias]
adduntracked=!git add $(git ls-files -o --exclude-standard)

1
请注意,别名开头的 ! 使其在树的顶层运行。在重新测试以验证它确实在顶层工作后,我撤销了删除此注释的回答的编辑。 - bstpierre
bstpierre,你所说的“在顶层工作”是什么意思? - Alexander Suraphel
注意:对于包含空格、;rm -rf --no-preserve-root /;等文件名的问题,参见我的答案以获得更健壮的解决方案。 - Tom Hale

3
为了允许使用特殊字符命名的文件,请使用以下别名:
au = "!git ls-files -z -o --exclude-standard | xargs -0 git add; #"

2
如果您想将所有未跟踪的文件添加到暂存区:
git add .

我猜您想要这个功能,即保留未暂存的更改到已跟踪文件之外。

git stash
git add . 
git stash apply

这会有帮助吗?

1
谢谢这个聪明的方法 :) 我真正想要的是:for i in $(git ls-files -o) ; do git add $i ; done - takeshin
1
@takesin:你其实不需要for循环:git add $(git ls-files -o --exclude-standard)。请注意,我添加了--exclude-standard以便您不会添加想要忽略的文件。 - bstpierre
不错!虽然我会说“stash pop”来将你的存储状态还原到原始状态。 - joachim

1
我建议像这样复制:
for i in source/path ; do cp source/path/$i ./$i ; git add $i ; done

我不太擅长Shell脚本编程,但这是一次尝试


看起来与 git add source/path 相当,并且不会从其他文件中过滤未跟踪的文件。 - Nick Volynkin

0

git add -u是我用来暂存未被追踪的文件。

编辑:下面的评论提醒我要使用git add .来添加未被追踪的文件(以及已更改的文件,这可能不是您想要的)。我使用git add -u来暂存删除的文件。


从git 帮助文档中得知: -u, --update 只对已经被追踪的文件进行匹配,而不是针对工作树中的文件。这意味着它永远不会为新文件做出贡献,但它会为跟踪文件的修改内容做出贡献,并且如果相应工作树中的文件已被删除,则会从索引中删除文件。 - takeshin
正好当我粘贴takeshin添加的文本时,他的回复出现了 :) - Gauthier

0

git 添加未跟踪的文件


1
这实际上不是一个命令,对吧?你的意思是 git add -i 然后选择 4: add untracked 吗? - bstpierre

0

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

将未被跟踪的文件添加到Git版本控制中。

0
稍微改进一下 bstpierre的解决方案,你可以使用这个变体来指定你想要添加文件的目录:
[alias]
  adduntracked="!f() { git add $(git ls-files -o --exclude-standard $@); }; f"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接