一个文件跨多个目录的版本控制,避免与现有 Git 回购冲突

Version Control For One File Across Multiple Directories, Avoiding Conflict With Existing Git Repos

我正在为 Latex 开发一个可用于多种场景的样式文件。对于每个场景,我在包含样式文件副本的目录中都有一个测试用例。

样式文件和测试用例在 Git 上有单独的存储库:

为了便于测试和最终用户,如果样式文件与场景位于同一目录中,则更容易。这一切都给了我很多不同步的机会。

目前我手动同步每个样式文件,但希望在某种差异/版本控制工具的支持下进行同步。

我已经尝试设置另一个存储库并将样式文件放在那里,并使用 mercurial 同步以便我有另一个目录...

...但是 mercurial 也使用同步整个目录的概念工作,所以当我尝试将 mercurial repo 中的样式文件克隆到测试用例所在的目录时,我最终得到了 mercurial 然后尝试将示例拉入样式文件存储库。

问题:如何在我已经使用 git 用于不同存储库的目录中对一个文件进行版本控制?

(我将满怀感激地接受建设性的"you're doing it all wrong - try this"回答!)

好的,检查一下我的理解:

这里有四种类型的内容需要考虑:小型实用程序库代码(恰好适合此处的一个文件)、production/external 实用程序的用户以及测试和示例。您正在提供库以及测试和示例用例,并希望将您的有效负载融入外部用户的工作流程。

如果这是编译代码,那将是非常普通的:构建和测试您的实用程序,发布产品,生产用户使用发布的库,或者如果他们更喜欢它,则将其自己构建为子模块并发送或携带补丁。

当没有编译和构建步骤时,尤其是当 payload 像这里一样是单个文件时,边界开始有点令人厌烦,自然的愿望是 "can't I just get the one file?".

是吗?假设我已经足够接近 运行 了:


需要了解的是 Git 中唯一真正重要的结构是祖先链接。任何存储库都可以包含任意数量的不同历史记录。

特别是,使用您的样式库的人可以引入您发布的历史记录并以他们喜欢的方式使用它们。

所有用户:

git remote add acstyle u://r/l
git fetch acstyle

然后用户可以只提供内容

git checkout acstyle/payload -- .

现在他们的结帐有最新的负载。

更熟悉 Git 的用户可能希望它为他们保留记录,他们可以

git merge acstyle/payload    # initially with `--allow-unrelated-histories`

他们的结帐具有相同的附加内容,但也记录了它的祖先。

您可以在已发布的存储库中提供多个分支,例如将裸负载合并到 testcase/example 场景中。很容易做到。

假设您有一个开发 "master" 分支,其中包含您所有的测试用例和示例,但您想要构建如上所述的有效载荷分支,不会乱扔其他人的存储库。

最小 payload 分支的初始构造:

# from any clean checkout
git checkout --orphan payload
git reset --hard
git checkout master -- acstyle.sty
git commit -m "acstyle-payload-v1.0"

当需要发布新的负载版本时,再次发布但忽略孤儿和重置位,或者发布提示背后的完整历史记录,这样它就在那里但不会乱结账,你可以这样做

git checkout payload
git merge -s ours --no-commit master    # add `--allow-unrelated-histories` the first time
git checkout master -- acstyle.sty      
git commit -m "acstyle-payload-v1.1"

我不知道如何预测用户是否会喜欢以这种方式合并 -s ours 背后的完整开发历史,维护两者很容易。

您可以以同样的方式维护有效负载加示例分支和任何其他看起来不错的分支,用户只需获取他们想要的内容并将其组合到他们自己想要的历史记录中。

如果您要走这条路,请不要在已发布的存储库中使用标签,Git 默认情况下会从它从中获取的每个存储库中复制所有标签,它们会乱扔用户的历史记录。相反,只需使用提交消息,用户可以使用 :/ 语法根据消息内容引用提交,如果他们想要的不是最新的

git checkout :/^acstyle-payload-v0.9a -- acstyle.sty

他们可以通过

查看已发布版本的日志
git log --oneline ---first-parent acstyle/payload