如何在不暂存的情况下 git 添加新文件



为了有效地使用 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 部分,以便我以后可以将其添加到 A 中,并带有 git add -pgit add foo(或其他)。

编辑

关于add -N解决方案,这是行不通的,因为如果我在说完add -N并且没有正确添加它后尝试提交,git 会抱怨,因为它不知道如何处理空文件:

foo: not added yet
error: Error building trees

在 Git 2.5 中, git add -N/--intent-to-add 实际上是正确的解决方案。
新文件不会是下一次提交的一部分。

参见 提交 d95d728 由 Nguyễn Thái Ngọc Duy ( pclouds ) (合并到 d0c692263):

diff-lib.c:调整 I-T-A 条目在差异中的位置

问题:

由"git add -N"添加的条目是用户的提醒,以便他们在提交之前不要忘记添加它们。这些条目出现在索引中,即使它们不是真实的。它们在索引中的存在导致了一个令人困惑的"git status",如下所示:

On branch master
Changes to be committed:
        new file:   foo
Changes not staged for commit:
        modified:   foo

如果您执行"git commit","即使"foo"将不包括在内 "status"将其报告为"to be committed"。

溶液:

此修补程序将输出更改为

On branch master
Changes not staged for commit:
        new file:   foo
no changes added to commit

这意味着:

将此类路径视为"尚未添加到索引中,但 Git 已经知道它们"; "git diff HEAD"和"git diff --cached HEAD"不应该谈论它们,"git diff"应该把它们显示为新的。 + 尚未添加到索引中的文件。

也许你可以尝试编写一些预提交钩子,如果你有未跟踪的文件,它会提醒你。不过,这将要求你始终保持你的 git 目录干净才能工作(显然你需要保持最新的 .gitignore )。

还可以尝试git add -i它类似于git add -p但也具有用于添加新文件的界面。

在进行更改之前,您可以使用该路径提交一个空文件。如果你已经在那里写了东西,把文件移开,做一个空白文件,提交它,然后像git commit --amend往常一样添加-p,这样你就没有"添加空白文件"提交了。

最新更新