0

我有一个文件 abc.log (出于某种原因)在 git 中被跟踪,但我(也许愚蠢地)设置为 --skip-worktree 所以对它的更改不会显示在我对存储库的提交中。我想更改分支:

~ % git checkout master                                                
error: Your local changes to the following files would be overwritten by checkout:
    abc.log
Please commit your changes or stash them before you switch branches.
Aborting

然后我尝试刷新索引并强制结帐:

~ % git update-index --really-refresh 
~ % git checkout master -f
error: Entry 'abc.log' not uptodate. Cannot merge.

但是, abc.log 在本地没有任何更改:

~ % git status            
On branch xyz
Your branch is ahead of 'origin/xyz' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Undo git update-index --assume-unchanged <file>之后,我尝试再次将其设置为 no-skip-worktree。

~ % git update-index --no-skip-worktree --no-assume-unchanged abc.log
fatal: Unable to mark file dump.rbd

按照https://stackoverflow.com/a/42363882之类的建议,我看到它被 git 跟踪,目前设置为跳过工作树

~ % git ls-files -v | grep "S "                                        
S abc.log

然而,仅仅寻找它并没有显示它

~ % git ls-files --error-unmatch abc.log                           
error: pathspec 'abc.log' did not match any file(s) known to git
Did you forget to 'git add'?

而且我无法按如下方式添加

~ % git add dump.rbd
fatal: pathspec 'abc.log' did not match any files
4

2 回答 2

2

您已经发现了Git 常见问题解答指出无法忽略对跟踪文件的更改的原因。从常见问题解答:

Git 没有提供这样做的方法。原因是如果 Git 需要覆盖这个文件,例如在结帐期间,它不知道对文件的更改是否宝贵并且应该保留,或者它们是否无关紧要并且可以安全地销毁。因此,它必须采取安全路线并始终保护它们。

尝试使用 git update-index 的某些功能是很诱人的,即假设未更改和跳过工作树位,但是这些不能正常工作,因此不应该以这种方式使用。

这根本不起作用,也没有办法让它起作用。你只需要不这样做。由于该文件看起来像一个日志文件,因此可能根本不应该签入它,这将解决您的问题。您可以使用 删除它git rm

于 2021-07-23T22:12:16.927 回答
1

bk2204 的答案对于这种情况是正确的,但更一般地说,可以使用一段时间来进行一些未提交的更改--skip-worktree。当你遇到这个问题时,使用的技巧是:

  1. 清除--skip-worktree标志(带.)git update-index --no-skip-worktree path
  2. 添加并提交更改,作为对一个文件(或一组文件)的更改。给它一个好的提交信息,这样你就可以很容易地找到这个提交,包括在它被重新定位之后。
  3. 获取上游提交。
  4. 根据需要进行变基或合并。
  5. 用于git rebase -i将步骤 2 中的提交“移动”为分支上的单独最终提交。确保一切仍然有效,并且您仍然希望将其作为未提交的更改与--skip-worktreeset 一起携带,即,您不希望对此文件(或这些文件,复数)提交更改。如果您确实想要提交更改,请根据需要进行这些更改、提交和重复,以便您想要携带的“额外”更改仍然是最终提交。
  6. 使用git reset(使用默认值--mixed)删除最终提交,该提交具有您想要作为未提交更改携带的此更改。
  7. 用于再次git update-index设置--skip-worktree标志。

这个简单的 7 步流程可让您轻松推进更改。如果多个文件受到影响,您可能希望编写一个小工具来让您--skip-worktree适当地添加和清除标志。(我有一个可以让您轻松查看和删除标志,但没有一个可以让您将它们添加回来 -for i in <list>; do git update-index --skip-worktree $i; done无论如何这只是输入的问题,我不想在自动化方面走那么远这个。)

于 2021-07-24T07:25:45.033 回答