簡體   English   中英

所有分支都使用git bundle進行增量備份

[英]Incremental backups with git bundle, for all branches

使用git bundle對git存儲庫進行增量備份的最簡單方法是什么?

如果我只想備份一個分支,我可以沿着這些方向做一些事情:

git bundle create foo last-backup..master
git tag -f last-backup master

但是如果我想備份所有內容(包括所有分支)呢?


要回答評論中的問題:

嚴格地說,只要解決方案滿足以下屬性,我就不需要使用通常的Git包:

  • 每個增量備份都是一個文件。 我可以將它存儲在某個地方,后續的增量備份不需要修改此文件。

  • 文件大小約等於自上次備份以來Git提交的總大小。 二進制文件的更改也可以有效地存儲。

  • 從那時起,完整備份+所有增量備份包含自動重建存儲庫所需的所有內容,包括所有分支。

(作為一個簡單的例子,簡單地在git存儲庫中構建一個包含最近更改過的文件的tar存檔,如果發生自動垃圾收集,則無法滿足第二個要求。)

理想情況下,我還希望有一個防止白痴的系統:

  • 我幾乎可以對我的Git存儲庫進行任何完整備份,以及所有最近的增量備份,我可以簡單地“拉”備份中的所有內容,並且存儲庫將是最新的。 特別是,完全備份和增量備份之間是否存在部分重疊並不重要。

如果我只需要處理一個分支,Git捆綁包就能很好地滿足這一切。

(我們與Jukka討論了這個問題,這是結果。)

預賽:

  1. 將最后一個備份作為backup.bundle
  2. 有一個指向backup.bundle的遠程backup

進行備份:

  1. git fetch backup - 只是為了確保我們是最新的
  2. git bundle create newbackup.bundle ^backup/A ^backup/BABC
    • 這意味着我們創建了一個包,它排除了包中已有的所有內容
    • refs/remotes/backup/生成所需的^backup/A style參數很容易
    • 同樣, A風格的參數來自refs/heads
  3. newbackup.bundle復制到您保留備份的位置
  4. newbackup.bundle替換backup.bundle ,以便知道從哪里開始下一次增量備份

恢復:

  1. 擁有一個空的存儲庫或代表存儲庫的舊版本
  2. 對於每個備份文件,按順序:
    1. git remote rm recovery
    2. git remote add recovery <name-of-bundle>
    3. git fetch recovery - 你需要命名遙控器才能工作
  3. 現在你應該在refs/remotes/backup提供每個分支

嘗試使用--since和--all。

創建第一個備份:

git bundle create mybundle-all --all

進行增量備份:

git bundle create mybundle-inc --since=10.days --all

增量應包含過去10天內發生的所有分支上的所有提交。 確保--since參數回溯得足夠遠,否則您可能會錯過提交。 如果在該時間范圍內沒有發生任何提交,Git也將拒絕創建捆綁包,因此請做好計划。

你可以做到

git clone --mirror <your_repo> my-backup.git

它會創建一個包含所有引用的裸倉庫。

然后你可以定期做git push --mirror <my-backup>

似乎opqdonut解決方案不起作用,導致^ backup / A ^ backup / B僅指向上次增量備份。 實際上,需要從之前的所有增量備份中排除引用。

需要為以前的每個捆綁包創建遠程數據庫。

UPD:不,它應該有效,請參閱下面的Jukka評論。

暫無
暫無

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

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