2017-01-18 42 views
0

如何確定自上一個git包創建以來是否提交了更改,而無需創建工作存儲庫,循環每個分支並記錄每個頭修訂?如何確定上游git存儲庫何時被修改 - 用於創建備份

我在GIT中發現的一個短暫下降是在企業中使用的適當備份支持。企業與開源開發的不同之處在於,總是存在1)權威的存儲庫和2)處理大量數據的備份系統。因此,1)非常頻繁地備份以及2)僅在存在新的更改時才運行備份過程。我的問題是找到#2的解決方案。

我使用git bundle來創建我的檔案,但我沒有找到一個確定的方法來確定自上次備份以來是否提交了新的更改。

我一直在試圖找到git rev-list的選項組合來列出自上次捆綁包後的新提交標識符,但一直不成功。關於這一主題的查詢顯示用寫的很不錯backup script

git -C "${path}" rev-parse --short=10 HEAD 

標記與提交ID捆綁。該解決方案不足以描述git存儲庫的快照,因爲其他分支可能已經更新,使上游存儲庫的HEAD修訂版本保持不變。

我看過使用--max-age=<lastbackup epoch>,但很快發現它可能讓開發人員在備份運行後推送舊的更改,並且由於提交的日期不會更改,結果是它們比最後的備份日期,因此備份不會被觸發。

最好的辦法我至今是:

git -C ${repo} rev-list -a --branches ${prev_commit}..HEAD 

它確實從其他部門獲取新版本,但將繼續即使在較新的報告對其他部門提交的修訂已經到頭上畫了。

我還沒有開始關注增量備份,但我已經看到爲了驗證一個,我需要創建和管理工作存儲庫,因爲我更願意在服務器上維護裸存儲庫。

另外我會注意到,我還沒有找到一個選項來git分支去除「*」,所以它只會給我一個清晰的腳本分支列表。

其他企業如何備份其存儲庫?

+1

你在使用Git提供程序,如GitHub或Bitbucket嗎?這些都將您的數據備份到幕後AFAIK。 –

+0

沒有評論備份策略,我會注意到'git rev-list'是錯誤的工具。使用'git for-each-ref'來獲取一些或全部引用的當前值。 – torek

+0

@TimBiegeleisen使用服務提供商不是一種選擇。認爲企業,IP等 –

回答

0

您可以改爲使用git -C "${path}" rev-parse --short=10 --branches。即使它在輸出結束時顯示fatal: Needed a single revision,但它也可以顯示每個更新分支的最新提交。

當您使用git進行版本控制時,您只需要git服務器或第三方託管的服務器(如github,bitbucket等)來管理不同的版本。這非常方便且省時,並且您不需要關心現在的版本。優點是提交歷史不會丟失,所以用這種方式您不需要再進行歸檔。

+0

請注意,'--branches'將獲得每個分支名稱的當前對象ID(這些OID必須是提交),但不會獲取標籤的OID(這些可能是註釋標籤,因此您可能需要標籤OID和剝皮標籤OID)。如果您的目標是真的保存*所有*,您應該考慮一個事實,即標籤可以保護沒有分支名稱保護的對象。 (例如,您可能會將標記指向包含基本GPG簽名的Blob。)您可能還會關注註釋,它們不在分支名稱空間中提交。 – torek

+0

謝謝,但我正在尋找一個企業解決方案,所以使用github,或者bitbucket服務不是一個選項。這些服務如何提供git repos的備份,還是隻依賴通用磁盤(網絡設備)備份? –

+0

如果您使用github或bitbucket,則不需要備份。他們在服務器上存儲回購信息。用戶需要做的是將repo克隆到本地,並根據需要將其簽出到不同的版本。 –