git assume unchanged与skip worktree的区别 - 忽略符号链接

27

我有一个git仓库和windows的问题。问题是git仓库里有一个Linux符号链接,在运行Windows的开发人员中,这显然不起作用。现在,由于该符号链接不应更改,因此我想找到一种方法在开发人员上删除它并添加一个文件夹代替它(符号链接所指向的内容),但让git忽略这些特定的更改。现在,我可以删除符号链接,创建同名文件夹并添加一个.gitignore以忽略所有内容。至于确保git忽略符号链接的删除,我在研究中找到了两个可能的解决方案。我找到的解决方案是:

git update-index --assume-unchanged [FILE]
git update-index --skip-worktree [FILE]

我的问题是哪个选项最好?我想确保一旦我这样做了,它就不会被撤销,除非我特别指定。我想确保还原、重置、创建分支、合并等操作都可以正常工作。


@Flimm 但是这个问题很老了。 - luizfls
1个回答

24

这两个选项都存在问题。--assume-unchanged 会在索引被丢弃(例如git reset)时重置,所以迟早会遇到问题。 --skip-worktree 也一样... 然而,你可以维护一个本地文件列表,不要检出这些文件,这样每当需要时跳过工作树位就会自动设置。以下是步骤:

  • core.sparseCheckout设置为仓库的true。
  • 创建一个名为.git/info/sparse-checkout的文件,其中包含两个模式:*用于包含所有内容和!/foo用于排除符号链接foo(/表示锚定到顶层)。
  • 现在,手动设置跳过工作树位,然后删除符号链接。

现在,您可以继续进行而不必担心git会自动提交目录,但请注意,如果有人明确在目录或其中的任何文件上运行git add,您仍然会遇到问题。

[编辑后添加:] 经进一步讨论,我们确定了解决该问题的方法:将带有*模式的 .gitignore 文件放置在目录中。


我不小心按下了SKIP WORK TREE按钮,现在无法切换到本地分支。我该怎么做来撤销我错误的操作?是否有选项可以解决这个问题? - Dev

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