簡體   English   中英

Git:將單個文件從一個存儲庫鏡像到另一個存儲庫

[英]Git: Mirror single file from one repository into another

假設我在存儲庫 A 中有兩個存儲庫和一個參數文件。存儲庫 B 需要相同的文件,如果存儲庫 A 中的此文件有更新,則應使用 git 更新存儲庫 B 中的拉入。 不需要另一種方式(從 B 到 A)。

有沒有一種簡單的方法可以將存儲庫中的單個文件鏡像到另一個文件並保持最新? 解決方案還可以利用 CI 管道!

面對這個有什么想法嗎?

有沒有一種簡單的方法可以將存儲庫中的單個文件鏡像到另一個文件並保持最新?

簡單也許是情人眼里。 我懷疑對於您的情況,答案是否定的,但也許您畢竟會認為以下內容很簡單。

這里要記住的關鍵是 Git 不存儲文件 Git 商店承諾 然后提交存儲文件,但這是一個 package 交易:每個提交都有每個文件的完整快照。 您要么有提交——因此有所有文件——要么沒有提交,因此沒有文件。

這意味着如果您想處理單個文件而不是整個文件集合,您有多種選擇:

  • 在存儲庫 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 系統往往非常擅長做這樣的特殊工作。)

    在這里,不是將參數文件作為常規“所有文件,包括參數文件”提交提交,而是進行參數文件提交,作為提交,僅包含一個參數文件。 到目前為止,這與擁有第三個 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

    您現在可以更新文件並提交。 然后你 go 回到你的主分支(或任何其他分支)並且這里沒有參數文件,所以現在你paramfile-branch提取參數文件:

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

    您在此分支中的.gitignore文件將paramfile列為已忽略( paramfile-branch上的提交中根本沒有.gitignore文件:在那里,它是一個跟蹤文件,也是唯一的文件)所以這只是一個臨時文件,到目前為止就Git而言。

    由於文件只repo A 中更新過,repo B 可以從 repo A 的paramfile-branch獲取,將生成的 hash ID 寫入 repo B 的paramfile-branch名稱:

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

    從這個分支中獲取新的提交。

最后一種方法只是將“repo C”嵌入到存儲庫 A 和 B 中的一種方法,使用單個分支名稱( paramfile-branch )來保存“repo C”中最后一次提交的 hash ID(嵌入到 A 和B).

假設我在存儲庫 A 中有兩個存儲庫和一個參數文件。存儲庫 B 需要相同的文件,如果存儲庫 A 對此文件有更新,則應使用 git 拉入存儲庫 B 進行更新。 不需要其他方式(從 B 到 A)。

有沒有一種簡單的方法可以將存儲庫中的單個文件鏡像到另一個文件並使其保持最新? 解決方案也可以利用 CI 管道!

面對這個有什么想法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM