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](//i1.wp.com/i.stack.imgur.com/tumAc.png)
那个 file.xml 将是私有的(可以添加到您的 .gitignore 中)并且可以在本地随意修改。
每个用户仍然需要在本地激活内容过滤器驱动程序,但如果他们*需要 file.xml,他们将必须这样做(如项目的自述文件中所述)。
-
再次感谢。当您说结帐时生成文件时,这会是每个结帐吗?这会覆盖本地副本吗?
-
@user1589188 它将在每次结帐时执行您在 .gitattributes 中与 file.xml.do-not-modify 关联的涂抹脚本:添加该脚本所需的任何智能是微不足道的,例如,不覆盖生成的文件,如果它已经存在。 stackoverflow.com/a/638980/6309
2 已经足够好了,但是您仍然需要一种方法来强制执行您不被修改的文件。
由于 Git 的分布式特性,这意味着有一个预接收钩子,它将检测该特定文件是否被推送,并拒绝推送。
1
| git diff --name-only $OLD..$NEW |
参见"git pre-receive (push) hook 检测是否在特定文件中完成了合并"(此处的合并部分不相关)
另请参阅"Git 预接收挂钩"以列出所有收到的 oldref newref 中的所有文件。
- 谢谢。我还没有研究这个细节,但是根据你的描述,这意味着每次fork尝试推送这个文件都会被拒绝?这如何帮助 fork 知道应该运行假设不变的命令以避免被拒绝?
-
@user1589188 上游仓库不知道"假设未更改"状态(这纯粹是下游仓库的本地)。它所知道的是,如果它看到某个特定的文件被推送,这意味着有人试图发布对该文件所做的修改,我们必须阻止这种修改。这是对"不对文件进行新的修改"这一新政策的集中实施。
-
@user1589188 您的解决方案 2 帮助某些用户(他们将花时间配置他们的 repo)记住他们不应该添加和提交对该文件的本地修改,但我的建议将帮助所有用户意识到他们不能提交(并推送) 对该文件的任何修改。
-
多谢多谢,我明白了。但比起这种被动的防御方法,我认为我更喜欢一些更主动的东西,比如 git repo 中的配置,因为任何分叉的人都会得到默认情况下不跟踪某些文件。
-
@user1589188 这就是我的观点:"由于 Git 的分布式特性"意味着我建议的内容是您将获得的最活跃的内容。如果需要,可以添加一些自述文件,但是集中的策略执行更容易维护以某种方式分发的策略。
-
没关系,但我不控制 gitlab 托管,即使我拥有上游项目,这也不能由我自己完成。