【发布时间】:2012-06-18 16:32:12
【问题描述】:
为了有效地(并且按照预期)使用 git,我会进行小的原子提交,而我确实有更长的会话,我不仅会更改一件事。因此,我大量使用git add -p。不过,这不适用于全新的文件,因为我以后往往会忘记它们。
我想要做的是,告诉git 有一个新文件,我希望它跟踪,但不暂存它:
示例:运行 git status 产生:
# On branch my-current-branch
# Your branch is ahead of 'origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
<<UNKNOWN SECTION>> // C
如果我在 C 部分有一个文件 foo,我说 git add foo 它将转到 A 部分。如果我说git add -N foo,它将同时发送到 A 和 B。但是,这意味着它将包含在下一次提交中,至少因为有一个新文件这一事实。
我希望它专门放在 B 部分,以便我以后可以使用 git add -p 或 git add foo(或其他)将它添加到 A。
编辑
关于add -N 解决方案,这不起作用,因为如果我在说add -N 并且没有 正确添加它之后尝试提交,git 会抱怨,因为它不知道如何处理空文件:
foo: not added yet
error: Error building trees
【问题讨论】:
-
:8 我建议你使用-N,但你已经在帖子中提到它不适合你!因此,我的建议是通过保持在 gitignore 之上来保持未跟踪文件部分为空,因此其中的任何新内容都会立即显而易见。
-
@Robert:是的,我实际上有一堆 gitignore,但我没能设法保持部分完全干净,总是有 一些 垃圾,我的眼睛似乎已经习惯了根本看不到该部分。
-
我不认为 git 可以选择完全按照您的要求进行操作... -N 选项似乎最接近,但是如果您不想进行创建(应该是无害的)除了为此目的使用未跟踪的文件之外,我没有看到其他选择。恕我直言,无论如何保持该部分清洁是一个好习惯 - 一切都是源文件或构建产品
-
我想建议
git add foo+git reset HEAD foo,但事实证明reset将一个新文件移回C 部分,而不是像旧文件的B 部分。呜呜…… -
注意:Git 2.5(2015 年第二季度)使
git add -N现在成为一个可行的解决方案:请参阅 my answer below