使用 git add -N 后文件没有进入提交
Posted
技术标签:
【中文标题】使用 git add -N 后文件没有进入提交【英文标题】:File doesn′t get into the commit after using git add -N 【发布时间】:2015-03-19 22:06:38 【问题描述】:我想提交 Python 模块的 __init__.py
文件,该文件在我的磁盘上已经包含代码。但是,对于当前提交,我想将其添加为空,因为这部分代码还有待测试。因此,我使用了
$ git add -N __init__.py
该文件存在于git status
的输出中,但如果我发出git commit
,所有其他文件都会进入提交,除了__init__.py
,而__init__.py
又根据git status
保留在索引中。
git-add
的手册页说 -N
是这样的
Record only the fact that the path will be added later. An entry for the path is placed in the index with no content.
有没有办法绕过这个will be added later
部分,即添加文件为空而不暂时删除其内容?
编辑:当前 (2.2.0) Git 会发生这种情况。使用 1.7.1 和一个小型测试存储库,我收到一个错误:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: b
#
$ git commit -m 'test'
b: not added yet
error: Error building trees
【问题讨论】:
我相信当您在添加时使用-N
标志时,您需要使用-a
运行git commit。来自帮助:这对于使用 git diff 显示此类文件的未暂存内容并使用 git commit -a 提交它们非常有用。
这是不行的,因为它会提交所有其他修改过的文件,不管我是否用git add
添加它们。但是,未跟踪的文件仍会以这种方式保持未跟踪状态。
太搞笑了。当仅使用 git add -N
然后提交时,您可以创建一个完全空的提交。只是想分享那个小宝石。
您可以在git add -N
之后使用git add -p
并拒绝添加您被询问的单个差异大块。请参阅this answer 了解更多信息。
@SvenMarnach 我实际上已经尝试过了,至少在 git 1.9.4 中无法解决问题。
【参考方案1】:
这应该在 Git 2.5(2015 年第二季度)中修复,这意味着 git commit
不会尝试包含“打算稍后添加”的新文件。
请参阅 Nguyễn Thái Ngọc Duy (pclouds
) 的 commit d95d728(合并到 d0c692263)
diff-lib.c
:调整i-t-a
在diff
中的位置
问题:
“
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
”应该将它们显示为尚未添加到索引中的新文件。
2016 年第四季度更新:
commit
:修复空提交创建时没有更改但 ita 条目
(ita
或 i-t-a
是“打算添加”)
参见Nguyễn Thái Ngọc Duy (pclouds
)commit 2c49f7f、commit 018ec3c、commit b42b451、commit 425a28e(2016 年 10 月 24 日)。(由 Junio C Hamano -- gitster
-- 合并到 commit 6503602,2016 年 10 月 27 日)
当“
git add -N
”将新路径添加到索引中时,足以绕过“git commit
”的检查,避免在没有“--allow-empty
”的情况下进行空提交。 同样的逻辑阻止了“git status
”在“Changes not staged for commit
”部分显示“new file
”这样的路径。
git diff
man page 现在包括:
--ita-invisible-in-index:
默认情况下,由“
git add -N
”添加的条目在“git diff
”中显示为现有的空文件,在“git diff --cached
”中显示为新文件。 此选项使条目在“git diff
”中显示为新文件,而在“git diff --cached
”中不存在。可以使用
--ita-visible-in-index
恢复此选项。这两个选项都是实验性的,将来可能会被删除。
2018 年第一季度更新(Git 2.16.x/2.17),git status
再次改进。
“git status
”,在工作树中移动路径后(因此制作
它显示为“已删除”),然后使用 -N
选项添加(因此
使其显示为“已添加”)将其检测为重命名,但没有
正确报告新旧路径名。
请参阅commit 176ea74、commit 5134ccd、commit ea56f97、commit 98bc94e、commit 06dba2b、commit 6de5aaf(2017 年 12 月 27 日)Nguyễn Thái Ngọc Duy (pclouds
)。
帮助者:Igor Djordjevic (boogisha
)。(由 Junio C Hamano -- gitster
-- 合并于 commit bc3dca0,2018 年 1 月 23 日)
注意:i-t-a
或 ita
是“打算添加”。
wt-status.c
: 处理工作树重命名425a28e 之前(diff-lib:允许将 ita 条目视为“尚不存在” in index" - 2016-10-24, Git 2.11.0-rc0) 索引中从来没有“新文件”,这实际上禁用了重命名检测,因为我们只在 diff 对中出现新文件时检测重命名。
在提交之后,一个 i-t-a 条目可以作为一个新文件出现在“
git diff-files
”中。 但是wt-status.c
中的 diff 回调函数并没有处理这种情况,会产生不正确的状态输出。
使用 Git 2.20 更新 2018 年第四季度,git status
避免在同一目标上显示多个重命名。
参见 Elijah Newren (newren
) 的 commit 3e73cc6(2018 年 9 月 27 日)。(由 Junio C Hamano -- gitster
-- 合并到 commit 98f3f00,2018 年 10 月 16 日)
commit
: 修复错误BUG,'同一目标上的多个重命名?怎么样?'
builtin/commit.c:prepare_to_commit()
可以调用run_status()
两次,如果 使用编辑器,包括状态,并且用户尝试记录 没有明确的--allow-empty
的非合并空提交。 如果还涉及重命名(由于使用 'git add -N'),则会触发wt-status.c
中的 BUG:BUG:wt-status.c:476:同一目标上的多个重命名?怎么样?
我们遇到这个错误的原因是两个
run_status()
调用使用相同的struct wt_status * (named s)
和s->change
在运行之间不会被释放。 更改插入到s
和string_list_insert
,这通常意味着 第二次运行只是重新计算所有相同的结果并覆盖 第一次计算的是什么。
【讨论】:
以上是关于使用 git add -N 后文件没有进入提交的主要内容,如果未能解决你的问题,请参考以下文章