2017-02-07 85 views
0

我想實現一個git-remote-helper信息。到目前爲止,我已經成功地使一個ineficient推:獲取有關特定對象

我用git log --format=%H <commitHash>知道什麼承諾,我需要發送

然後git cat-file -p <commitHash>^{tree}知道我需要一個發送提交哪些對象(我把名單在一組中的所有對象,以避免發送兩次相同)

我有一些問題fetch,因爲我不知道我需要從遠程什麼對象,我知道最後一次提交(由refs/heads/myBranch指出) 。什麼命令(:但是,因爲它缺少依賴對象(這是我想要獲取信息要能夠獲取它們的對象)

  • 我的問題是我以前的命令不會在工作取s)我應該使用能夠讀取object並知道它的父(s)(對於提交)和它指向的其他對象(對於提交或樹)

回答

0

它是我不太清楚你打算與這一切,這影響了「正確的方式」 - 儘管它可能不如說最有效的方式,去了解實際去做的事。儘管如此,git cat-file是非常「計劃外」的方式在Git的訪問一切。要讀取一個對象,你需要一個名字爲它-的SHA-1散列是顯而易見的名字,因爲它是名字,但適合git rev-parse任何足以和git cat-file,在其各種化身,將傾倒出來,可能應用了一些格式,或者使用--textconv--path篩選。

請注意,您需要遞歸操作:獲取提交會讓您獲得它的tree,其所有parent,作者和提交者以及日誌。獲取tree對象可以讓您將其組成子樹和blob,但每個子樹可能有更多的子樹,這是遞歸設置的位置。應用於最終blob(包括符號鏈接和gitlinks)的路徑是通過遞歸,即,如果頂層樹是Ť和你發現子樹D1其組件名稱是N1,含子樹D2命名N2,含有團塊命名N3,所述被存儲在其下的路徑名稱是N1/N2/N3。 (你可能不需要關心路徑,取決於你在做什麼 - 例如,Git自己的push和fetch操作不必關心,因爲它只是將這些對象存儲在存儲庫中,並且路徑名的構造發生在稍後,在git checkout的實例。)

同樣,獲得註釋標記對象讓你的object,但是這可能是另一個註釋標記對象,你,直到你達到一個無標籤(保留下這些ID雖然沒有遞歸這次涉及,因爲這些不嵌套)。

所有這一切說,git rev-list真正實現這一切的GOOP爲Git的自己運輸的。這就是爲什麼git rev-list具有--objects和相關選項的原因:您或Git可以使用存儲在各種引用名稱中的散列ID來指示它找到要提取或推送的對象集。