1 回答

TA貢獻1848條經驗 獲得超6個贊
如果您只需要文件內容,則無需“簽出”任何內容;您可以直接從存儲庫中提取它。但首先要注意:我既不是經驗豐富的 Go 程序員,也沒有合作go-git
過,所以可能有更優化的方法來做到這一點。
從標簽開始,您可以:
獲取標簽指向的提交
獲取提交指向的樹
遍歷樹尋找
package.json
如果找到它,請提取相應的 blob?,F在你有了你的內容!
上面的步驟可能看起來像這樣:
func getFileFromRef(repository *git.Repository, ref *plumbing.Hash, filename string) (bool, []byte, error) {
// Get the commit object corresponding to ref
commit, err := repository.CommitObject(*ref)
if err != nil {
return false, nil, err
}
// Get the tree object from the commit
tree, err := repository.TreeObject(commit.TreeHash)
if err != nil {
return false, nil, err
}
// Iterate through tree entries
for _, entry := range tree.Entries {
// If we find the target file...
if entry.Name == filename {
// Get the blob object from the repository
blob, err := repository.BlobObject(entry.Hash)
if err != nil {
return false, nil, err
}
// Ask for a Reader
reader, err := blob.Reader()
if err != nil {
return false, nil, err
}
// Allocate a slice for the data...
data := make([]byte, blob.Size)
// ...and read it in.
n, err := reader.Read(data)
if err != nil {
return false, nil, err
}
// Double check that we read as many bytes as
// we expected
if int64(n) != blob.Size {
return true, nil, fmt.Errorf("wrong size")
}
return true, data, nil
}
}
return false, nil, nil
}
上面的函數將在給定提交引用filename的情況下在存儲庫的頂層查找(正如所寫的那樣,它不會遍歷子目錄)。您需要修改函數中的tagsIterator.ForEach循環才能執行以下操作:main
err = tagsIterator.ForEach(func(tag *plumbing.Reference) error {
// Get the commit to which the tag refers. We need this to
// resolve annotated tags.
ref, err := repository.ResolveRevision(plumbing.Revision(tag.Hash().String()))
if err != nil {
handleError(err)
}
found, content, err := getFileFromRef(repository, ref, "package.json")
if found && err == nil {
fmt.Printf("found \"package.json\" in tag %s\n", tag.Name().Short())
fmt.Println(string(content))
}
return nil
})
我不知道這是否是您要找的東西,但了解該go-git軟件包很有趣。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報