如何仅在本地忽略跟踪的文件

时间:2017-02-14 17:40:40

标签: git

如何仅在本地忽略文件,该文件已在索引上?我不想从索引中删除文件,从而影响其他人。我尝试过的事情:

  • 将文件添加到.git \ info \ exclude
  • git update-index --assume-unchanged myFile.json
  • git update-index --skip-worktree myFile.json

当文件被修改并尝试切换分支时,两个update-index命令都会出错。

$ git checkout myBranch
error: Your local changes to the following files would be overwritten by checkout:
        myFile.json
Please commit your changes or stash them before you can switch branches.
Aborting

这个错误是因为"内容安全仍然是一个优先事项"根据{{​​3}}。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题变成:当您查看其他提交时

背景

使用myFile.json(不要在这里使用--skip-worktree,它意味着速度黑客而不是绝对指令;请参阅Git - Difference Between 'assume-unchanged' and 'skip-worktree')告诉Git它不应该过于关注对工作树文件的修改。但是......他们对工作树文件的修改。让我们说这个文件的路径是 P 。 Git保留了与--assume-unchanged提交匹配的索引版本 - 让我们说这是或者将在我们查看它时,提交ID 1234567.工作树版本发生了变化,当你做各种Git操作,它"跳过工作树版本"并继续使用 P 的索引版本。这使您可以使用 P 的(未更改的)索引版本修改工作树 P ,甚至可以根据需要进行新的提交。

在任何情况下, P 的工作树版本都不再匹配 P 的索引版本。正如我们所提到的,您现在在提交1234567上,即HEAD生成该哈希ID。

现在,我们发现Git要检查其他提交,即将git rev-parse HEAD从提交1234567移动到提交fedcba9或其他什么,Git必须替换或删除 P 的索引版本。它可以做到这一点,但正如它当前编码的那样,它也会替换或删除 P 的工作树版本。

(切换到某些其他其他提交,例如说8888888 - 在中国非常幸运的提交 - 可能需要触及 P的索引版本。在这种情况下,HEAD会很乐意将git checkout切换到该提交,然后再转回1234567.但是fedcba9并不是那么幸运。)

它"安全"替换或删除 P 的工作树版本当且仅当 P 的索引版本与HEAD版本匹配时 P ,从那时起,您可以从旧的HEAD获取 P 的版本,即我们示例中的1234567。但我们已经宣布 P 的工作树版本与HEAD版本不匹配。 HEAD标志不会改变操作的(非)安全性;它只是意味着各种其他操作不会抱怨工作树版本与索引版本不匹配。

那么,你 P 想要什么?

此时,您确定要从提交--skip-worktree转移到提交1234567

提交fedcba9包含 P 的版本, P 的索引版本与之匹配。 P 的工作树版本没有。

提交1234567拥有 P 的不同版本,或者说 P 应该不再存在,并且您的索引版本为 P 与此不匹配。

结帐fedcba9会将fedcba9 P 版本放入索引中,或从索引中删除 P 。动作替换或删除 P 的工作树版本,以便您可以查看(或不在){{1 }}。它绝对不同于fedcba9中的内容。

喜欢来查看该文件的那个版本吗?如果是这样,将 P 的当前工作树内容保存到其他位置,将 P 恢复到索引/ HEAD提交中的内容,然后查看{{1 }}。现在,您将在工作树中看到fedcba9中的内容。您保存在其他地方 P 将在其他地方安全。

不关心该文件版本中的内容,并希望保留现在的内容?如果是这样,将 P 的当前工作树内容保存到其他位置,将 P 恢复到索引/ HEAD提交中的内容,然后查看{{1 }}。然后使用保存的其他副本覆盖工作树中的任何内容。

Git不会为你选择其中任何一个,但你自己很容易做到。你只需要决定哪一个,然后再做。