git 不遵守 git 信息排除

git not honoring git info exclude

我正在处理一个共享存储库,我想为我自己排除某个目录下的所有文件。 所以我在 $GIT_ROOT/.git/info/exclude

中输入了一个条目
/path/to/folder/

之后我使用

删除了索引
git rm -r --cached /path/to/folder/*

A git status 在此之后显示一长串已删除的文件暂存以供提交。 我提交了更改,直到这里一切都很好,因为我所做的任何更改都没有被 git 跟踪。但我不能将相同的内容推送到 remote,因为这会扰乱其他开发人员的回购工作。 在此之后,如果我从远程拉出,它会显示合并冲突 modified by them/deleted by us。并使用 git reset --hard origin/<branch_name> 它再次开始跟踪文件夹。

难道不能推送到远程所以不能实现吗?

问题是您将文件提交为 "removed"。这意味着任何想要合并您的更改的人都将删除文件。此外,如果任何人(尚未合并您的更改)修改了这些文件,当您合并来自其他开发人员的更改时,您将遇到树冲突。在这种情况下,你能做的最好的事情就是告诉 git 到 不要 关心那些文件,同时将它们保留在项目下。这是通过 git update-index --assume-unchanged

完成的

更稳健的解决方案是:

  • 将该文件夹移出您的存储库
  • 添加符号链接
  • 忽略带有 git update-index --skip-worktree -- mysymlink
  • 的符号链接
  • 在移动的文件夹中添加一个 .gitignore(使用“*”模式)
  • 放置一个 sparce checkout 以便fetch/download那个特定的文件夹。

.git/info/sparse-checkout内容:

*
!/path/to/mysymlink

mysymlink 是我要忽略的文件夹的名称)

在“git assume unchanged vs skip worktree - ignoring a symbolic link”查看更多信息


OP shshnk mentions 更简单的方法:

I was able to implement it using just sparse-checkout.
Basically I mentioned the name of the folders in the format mentioned by you in .git/info/sparse-checkout file. Now git ignores the files in these folders.