簡體   English   中英

如何安全地鏡像git存儲庫?

[英]How to mirror a git repository safely?

我想用后台作業鏡像一些git存儲庫。 git clone --mirrorgit remote update不會保留使用強制推送未引用的對象,但我想在黑客的情況下保留這些對象。 有沒有工具來執行安全的git鏡像?

雖然缺少shell腳本會很繁瑣,但如果您有權訪問遠程存儲庫,那么您可以執行以下操作:

git fsck --lost-found

這將列出未引用的提交,然后您可以為每個提交創建一個分支:

git branch <branch-for-commit> <commit>

在這一點上沒有任何未被引用的東西,克隆將不會gc /丟失任何東西。 之后,如果選擇,則可以刪除分支,如刪除分支中所示

像這樣:

git fsck --lost-found | \
  grep dangling | \
  awk '{ system ("git branch" " br-" $3 " " $3); }'

保留懸空提交和blob。 然后,克隆后,

git branch -a | grep "br-" | xargs git branch -D

在重新閱讀問題和提供的答案后,我確信我誤解了海報的意圖。

現在我認為需要的是通過將其中的core.logAllRefUpdates設置為true來啟用目標存儲庫中的reflog ,並可能調整控制reflog到期策略的相關參數(grep git-config手冊頁面為世界“reflog”) )。 這將記錄所有“激烈”的refs重新定位,允許回滾強制推送等。

請注意,仍然唯一真正的防范,比如你說,“黑客攻擊”,或任何其他類型的損失已經獲得了異地備份,所以我認為,我在第一個答案中提出的建議仍然有效。

這幾乎是一個安全問題。 如果您不小心推送了密碼或其他內容,則可以修改您的提交並強制推送新提交。 之后git將不允許任何訪問第一次提交。

如果您真的需要這些提交,則需要訪問文件系統並使用rsync東西來獲取所有內容。 - 但請注意git不時會進行一些垃圾收集,因此舊的未引用的提交實際上會丟失。

我認為你可以使用兩階段備份:

  1. git fetch <remote> +refs/*:refs/*來更新裸鏡像存儲庫。

    git gc可能會“正常化”其內容。

  2. rdiff-backup將結果rdiff-backup到另一個目錄,該目錄將包含最后一個備份版本以及一組二進制diff文件,可用於重建任何以前的備份。

這樣,您就可以擁有備份快照的版本化歷史記錄。 由於rdiff-backups允許丟棄舊快照,因此您可以只記錄您認為合適的快照。

缺點是浪費磁盤空間:

  • rdiff-backup將生成源目錄的真實副本; 不會共享任何文件。
  • AFAIK,Git內部處理包文件不支持類似gzip程序的--rsyncable命令行選項,因此rdiff-backup生成的增量可能很大。 另一方面,在一個典型的Git repo中,任何包文件都應該只被附加,而不是重寫,所以我可能會在這里咆哮錯誤的樹。

如果您正在進入您控制的倉庫,那么有gc配置項可以控制被刪除的內容的每個方面以及何時; git remote update (以及其他所有內容) 保留未引用的對象,只要您願意。 具有管理訪問權限的任何人都可以通過標記來發布未引用的對象。

因此,為了安全地鏡像repo,如果你對它進行了管理控制,只需設置一個鈎子來將傳入的推送轉發到永不過期的備份倉庫。 否則,收到提交通知的關鍵將確保您記住您可能見過的所有內容。

Methinks其中一位評論者說得對:rsync或同等版本是你唯一的朋友,不管它不是Github的選擇。

看到這個(不可否認的老)線程:

http://kerneltrap.org/mailarchive/git/2007/8/28/256180/thread

引用其中一條消息:

它與Linux開發實踐無關。 我們不提取鈎子的根本原因是:

  • 它們不是存儲庫的一部分; 只需查看.gitattributes-in-the-index-but-not-worktree問題就可以找出原因,

  • 它是私有數據,就像配置一樣。 客戶沒有業務可以閱讀它們,更不用說獲取它們了,

  • 如果你在不同的機器上有鈎子,很可能你需要一個機制來更新鈎子......這自然意味着把鈎子放到他們自己的分支中。

可能有更多的理由不允許抓取鈎子這樣的東西。

所以......如果你想在多個地方部署它們,把鈎子放在他們自己的倉庫中是一個很好的解決方案,但除此之外,只要我知道回購中的各種物體,你就無法做到這一點。 ...

(該鏈接的信用額為: https//stackoverflow.com/a/6154010/417194

特別是對於github, 可能有github-services或web hooks的變通方法。

暫無
暫無

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

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