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

Git:将单个文件从一个存储库镜像到另一个存储库,git,continuous-integration,repository,mirror,Git,Continuous Integration,Repository,Mirror,假设我在存储库a中有两个存储库和一个参数文件。存储库B需要相同的文件,如果存储库a中有此文件的更新,则应使用存储库B中的git pull进行更新。另一种方式(从B到A)是不需要的 有没有一种简单的方法可以将一个文件从存储库镜像到另一个存储库并使其保持最新? 解决方案还可以利用CI管道 有什么办法面对这个问题吗 有没有一种简单的方法可以将一个文件从存储库镜像到另一个存储库并使其保持最新 在旁观者眼里,简单也许是最简单的。我怀疑对于你的情况,答案是否定的,但也许你会认为下面的问题很简单 这里要记住的

假设我在存储库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存储库“更胖”

  • > p>或者这是一个有点棘手的问题,考虑将参数文件隔离到它自己的存储库中,C.现在的存储库A和B都可以克隆C。当有新的参数文件时,将其添加到存储库C并提交。存储库A和B获取并更新它们的C克隆,从而获得最新的参数文件

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

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

    这里,不是将参数文件作为常规的“所有文件,包括参数文件”提交,而是将参数文件提交为仅包含一个参数文件的提交。到目前为止,这与拥有第三个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分支提取参数文件

    git show paramfile-branch:paramfile > paramfile  # or similar
    
    此分支中的
    .gitignore
    文件将
    paramfile
    列为已忽略(在
    paramfile分支的提交中根本没有
    .gitignore
    文件:这是一个跟踪文件,也是唯一的文件),因此就Git而言,这只是一个临时文件

    由于文件仅在repo A中更新,repo B可以从repo A的
    paramfile分支
    获取,将生成的哈希ID写入repo B的
    paramfile分支
    名称:

    git fetch repo-A +paramfile-branch:paramfile-branch
    
    从该分支获取新提交

最后一种方法只是在存储库a和B中嵌入“repo C”的一种方法,使用单个分支名称(
paramfile branch
)保存“repo C”中最后一次提交的哈希ID(嵌入到a和B中)