告诉 Git 分叉忘记跟踪之前跟踪但仍保留在上游的文件


Tell Git forks to forget about tracking a file that was tracked before but still keeping it in upstream

我有一个在开发过程中被跟踪并推送到远程上游仓库的文件,以便任何分叉的人都应该得到它。

现在这个文件是稳定的,在开发过程中不需要再碰它,但它仍然应该允许在每个 fork 上进行自定义更改。这些自定义更改应该只是 fork 中的本地更改,不应再污染上游。

这些都试过了:

  • 已经在 .gitignore 中添加了一个条目,但是由于该文件之前被跟踪过,这将无济于事。

  • 试过 git update-index --assume-unchanged file.xml,这在我的环境中很好,但它不会自动更新所有关于这个的分支。

  • 试过 git rm --cached file.xml,这很糟糕,因为这会从上游删除文件。虽然本地副本没有被删除,但是以后任何fork的新人都不会得到这个文件。

  • 我很想在 git 中看到一些自动的方法来实现这一点。否则我将不得不选择 2. 并要求每个分叉的人运行该命令,这真的很痛苦。


    I dont control the gitlab hosting

    在这种情况下,添加集中式策略更难(不过可以通过 webhook 完成)

    这是另一个建议:

    • file.xml 重命名为 file.xml.do-not-modify
    • 添加内容过滤器驱动程序(涂抹脚本),它将在结帐时自动生成 file.xml(通过复制 file.xml.do-not-modify)

    smudge

    那个 file.xml 将是私有的(可以添加到您的 .gitignore 中)并且可以在本地随意修改。

    每个用户仍然需要在本地激活内容过滤器驱动程序,但如果他们*需要 file.xml,他们将必须这样做(如项目的自述文件中所述)。


    2 已经足够好了,但是您仍然需要一种方法来强制执行您不被修改的文件。
    由于 Git 的分布式特性,这意味着有一个预接收钩子,它将检测该特定文件是否被推送,并拒绝推送。

    1
    git diff --name-only $OLD..$NEW

    参见"git pre-receive (push) hook 检测是否在特定文件中完成了合并"(此处的合并部分不相关)
    另请参阅"Git 预接收挂钩"以列出所有收到的 oldref newref 中的所有文件。