Git:将单个文件从一个库镜像到另一个库



假设我在存储库a中有两个存储库和一个参数文件。存储库B需要相同的文件,如果存储库a对此文件进行了更新,则应在存储库B中使用git pull进行更新。不需要另一种方式(从B到A)。

有没有一种简单的方法可以将单个文件从存储库镜像到另一个存储库并保持其最新?解决方案还可以利用CI管道!

面对这件事有什么想法吗?

有没有一种简单的方法可以将单个文件从存储库镜像到另一个存储库并保持最新?

简单可能在旁观者眼中。我怀疑,对于你的情况,答案是否定的,但也许你会认为以下事情很简单。

这里需要记住的关键一点是Git不存储文件。Git存储提交。提交然后存储文件,但这是一个包交易:每个提交都有每个文件的完整快照。您要么有一个提交——因此所有文件——要么没有提交,因此没有任何文件。

这意味着,如果你想处理单个文件,而不是整个文件集合,你有几个选择:

  • 在存储库A和B中使用不同的提交。A中的提交有很多文件,包括这个参数文件。B中的提交有很多文件,包括这个参数文件。

    这在B:中为您提供了两个子选项

    • B拥有A拥有的所有提交,加上只有B会遇到麻烦的B特定提交,每当A中有新的提交时,你都会得到它(整个提交),然后在B中构建一个新的B特定的提交,它接受最近的B特定提交,并将这个文件换成一个新文件,然后提交结果。

    • 或者,B没有来自A的所有提交。相反,当A中的这个文件更新时,您有一些软件(1)注意到;然后(2)通过提取一些现有的B特定提交、更新文件并进行新的B特定交付来生成新的B指定提交。

    您应该注意,这两个子选项基本上是相同的:区别在于存储库B是否自动包括来自存储库A的所有提交(Git非常擅长:Git喜欢将提交添加到其集合中)。创建新的B特定提交的软件需要某种方式来发现a何时有一个新的提交,该提交具有所讨论文件的不同版本,并且将所有a提交本地地放在B中使这很容易,但使B存储库";更胖";。

  • 或者——这就是事情变得有点棘手的地方——考虑将参数文件隔离到其自己的存储库C。现在存储库a和B都可以克隆C。当有新的参数文件时,将其添加到存储库C并提交。存储库A和B获取并更新其C的克隆,从而获得最新的参数文件。

    这是迄今为止最简单的机械方法。不过,它可能还有其他一些机械问题:也许参数文件的名称无法轻易更改。如果你的操作系统提供符号链接(或等效链接);参数文件";在A和B中是一个符号链接,指向它们将保存C的克隆及其参数文件的位置。或者,你可以在下一个整体选项中使用一个复杂的技巧。

  • 有一种混合变体;第三储存库";方法这种混合变体的缺点是,它使生成和提交新的参数文件变得更加困难,并且简单的git checkout在两个存储库a和B中的中也不起作用:相反,您需要一个特殊的";结账然后更新";序列(但CI系统往往非常擅长做这样的特殊工作。)

    这里,不是将参数文件提交为常规的";所有文件,包括参数文件";commit,您可以进行参数文件提交,作为提交,只包含一个参数文件。到目前为止,这与拥有第三个C存储库完全一样。

    然而,这是一个混合的原因,因为你没有第三个存储库,而是有了这个文件自己的";孤儿分支";在存储库A和B中。也就是说,而不是:

    git checkout main
    # now you have all files including the parameter file
    

    您将运行:

    rm paramfile                   # it's untracked: now it's gone
    git checkout paramfile-branch
    # now you have only one file: the parameter file, paramfile
    

    您现在可以更新文件并提交。然后返回到主分支(或任何其他分支),这里没有参数文件,所以现在您paramfile-branch:中提取参数文件

    git show paramfile-branch:paramfile > paramfile  # or similar
    

    该分支中的.gitignore文件将paramfile列为已忽略(paramfile-branch上的提交中根本没有.gitignore文件:这是一个跟踪的文件,也是仅文件),因此就Git而言,这只是一个临时文件。

    由于文件只在repo A中更新,因此repo B可以从repo A的paramfile-branch中提取,将生成的哈希ID写入repo B的paramfile-branch名称:

    git fetch repo-A +paramfile-branch:paramfile-branch
    

    从该分支获取新的提交。

最后一种方法只是嵌入";回购C";在存储库A和存储库B中使用单个分支名称(paramfile-branch)来保存最后一次提交的散列ID;回购C";(嵌入到A和B中)。