2017-02-26 93 views
6

我正在做一些Git的高級用法,爲了優化我的代碼的測試運行來查詢對象,所以請耐心等待下面的聲音與大多數人的用法相差甚遠用Git做。Git:探索遠程對象

我想做類似git cat-file -p [...]的東西,除了遙控器上的物體,不需要取物。即,我想說,「在遠程origin上,顯示我提交A,具體告訴我它的樹的標識是什麼;然後向我顯示樹的內容(blob和子樹的列表)。」我不需要獲取文件的實際內容,只是上面的信息。

我知道我可以從遠程獲取提交到我的本地倉庫,並使用git cat-file,但它會涉及從遠程獲取提交的所有父母,這可能需要很長時間。我需要這個很快,因爲它是在一個程序中完成的,該程序應該在許多不同的存儲庫上每天運行數百次。

有沒有辦法做到上述而不提取提交?

回答

1

我假定你已經驗證git fetch --depth=...不能做你想做的。

如果你有ssh/scp訪問遠程,你可以簡單地抓住indiviudal文件犯下(如果提交的哈希a1b2c3d4,它存儲在文件裏面objects/a1/b2c3d4)。將其放置在當地的.git/objects下相同的目錄/名稱下。然後照常使用當地git cat-file。從它的輸出中,你可以解析樹的散列,並從那裏繼續,取出單個的對象文件直到完成。 git cat-file不關心任何丟失的位,如果你有一個文件存在的散列,它會很高興地輸出它的內容。

爲避免您的「真實」本地存儲庫出現問題,您可以在一個空的回收站中執行此操作,即使用git init tmprepos或其他任何方式創建的回收站。這並不會傷害到那裏沒有別的東西。

編輯:git存儲包文件中的一些對象。請參閱https://git-scm.com/book/en/v1/Git-Internals-Transfer-Protocols以獲取有關如何獲取它們的說明。

+0

謝謝,這可能會工作,但這意味着我現在必須添加查看url的邏輯,看看它是否是ssh,如果使用SSH庫訪問服務器......這是一個大混亂。我希望有一個更好的解決方案。 –

+0

是的,你將不得不自己編程,沒有比'git fetch'更低級別的命令,你可以指示你獲取單獨的提交。我不會把它稱爲一團糟,只是編程。我將從'system(「scp ...」)開始,或者以您選擇的腳本語言調用系統命令的任何內容開始,並且如果由於子進程啓動導致性能不佳,則只能使用SSH庫。如果他們有http訪問權限,那麼它就是相同的答案,只是不同的protocoll。 – AnoE