git add -N后跟git stash会出现“无法合并”错误。

14

我需要隐藏一组包含新文件的更改,而不删除被忽略的目录

所以我尝试了这个:

git add --intent-to-add myNewFile.txt
git stash

结果是:

error: Entry 'myNewFile.txt' not uptodate. Cannot merge.
Cannot save the current worktree state

我该如何将修改过的文件和一个或多个选择的新文件存储,但不影响任何其他文件或目录(特别是那些在.gitignore中的文件)?
(这不是如何存储特定文件? 的重复,因为那个问题是如何存储已经添加的文件。我的问题是如何存储一个尚未被添加的文件。)

1
也许你可以先提交它们,然后在推送之前重写历史记录,这样做完所有事情后就好了。 - ckruczek
或者我可以手动将新文件移动到其他地方。甚至我可以创建一个临时分支而不是一个快照。但这并不是这个问题所要求的。实际上,“无法合并”错误看起来有点像一个 bug,即使它可能只是 git 某些深层实现细节的自然后果。 - Ian Goldby
如果我理解正确的话,真正的问题是“如何存储修改后的文件以及一个或多个选定的新文件,但不影响任何其他文件或目录”。我试图提出一种可能的解决方案,因为似乎无法存储特定的未跟踪文件,你只能存储所有未跟踪文件或不存储任何文件。 - ckruczek
"意图添加"的东西相当繁琐,并且与 git stash 不相容。作为一种不同的解决方法,你可以在目录中创建一个空的未跟踪文件,这样当你隐藏实际添加的文件时,Git就不会删除原本是空的目录,因为在否则为空的目录中有一个空的未跟踪文件。 - torek
1个回答

7

更新 - 进一步测试显示,普通提交(commit)相对来说效果较好。因此修改了推测性措辞...


问题似乎出在 git 如何处理没有内容的索引条目上。虽然它能够提交占位符条目周围的内容,但某些方面还是不能被 stash 接受。(我可以想到多个潜在挑战。最明显的是,stash 是由提交(commits)组成的——在数据库中——而且在这种情况下没有办法表示“计划提交”的意思。错误信息提示致命问题出现在其他地方,可能与 WIP 提交如何组装有关。)

也许你只需要使用 git add 命令添加文件(不带 -N 选项)。唯一不这么做的理由是,如果你有其他已暂存的更改并且不想让该文件的状态与这些其他更改混淆。

在这种情况下,折衷方案是添加一个空的文件版本(这样占位符就不会是没有内容的条目),然后将真实文件放在路径中,它将被视为“已修改”,而不是“未跟踪”,因此您可以在不使用有问题的 -u 选项的情况下进行存储。


1
我的“预期”文件不是空的,但在我逻辑上还没有准备好添加。因此,我使用--intent-to-add选项进行了添加。我只是添加了一下,以便可以stash,在准备进行repo同步时使用。由于我不会遇到您提到的混淆已暂存更改集的问题,所以我决定进行常规添加。 - cardiff space man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接