55

为了有效地(并且按照预期)使用 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

如果我foo在 C 部分有一个文件,我说git add foo它将转到 A 部分。如果我说git add -N foo它将同时发送到 A 和 B。但是,这意味着它将包含在下一次提交中,至少因为有一个新文件这一事实。

我希望它专门放在 B 部分,这样我以后可以用git add -por git add foo(或其他)将它添加到 A 中。

编辑

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

foo: not added yet
error: Error building trees
4

3 回答 3

39

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

请参阅Nguyễn Thái Ngọc Duy ( ) 的提交 d95d728pclouds(合并在d0c692263中):

diff-lib.c: 调整 diff 中 ita 条目的位置

问题:

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

On branch master
Changes to be committed:
        new file:   foo

Changes not staged for commit:
        modified:   foo

如果您执行“ ”,即使“ ”报告为“ git commit”,“ ”也不会被包括在内。foostatusto 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" 应该将它们显示为新的。+ 文件尚未添加到索引中。

于 2015-05-20T06:34:26.713 回答
3

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

也可以试试git add -i这类似于git add -p但也有一个添加新文件的界面。

于 2012-06-18T18:09:27.413 回答
1

在进行更改之前,您可以使用该路径提交一个空文件。如果您已经在那里写了东西,请将文件移开,制作一个空白文件,提交,然后正常添加 -p ,git commit --amend这样您就没有“添加空白文件”提交。

于 2012-06-18T16:35:06.620 回答