【问题标题】:How can you git add a new file without staging it?如何在不暂存的情况下 git 添加新文件?
【发布时间】: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 -pgit 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

标签: git staging git-index


【解决方案1】:

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

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

diff-lib.c: 调整 diff 中 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”应该将它们显示为新的。 + 文件尚未添加到索引中。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • git add -p 暗示 git add -i 但直接跳到选项 5: patch。只要您每次执行5: patch 时检查选项4: add untrackedgit add -i 就会一直带您到那里。
    【解决方案3】:

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

    【讨论】:

    • 我想如果我使用 add -N 它已经被提交为空。但是,--amend 解决方案意味着我必须记住这样做。这并不像完全忘记一个文件那么糟糕,但这意味着会弄乱以前的提交,我想避免这种情况。至少这是一个 hack,而不是一个干净的解决方案。
    • 我不认为它是一种黑客行为。使用 amend/rebase 来清除 未发布的 历史并没有错。
    • 您还可以将其中的一些内容别名为“git add-empty”之类的东西,这样就有一个可重复的过程,但您不必记住它。
    猜你喜欢
    • 2017-01-21
    • 2021-09-01
    • 2012-04-05
    • 2012-01-24
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多