2015-10-13 22 views
2

我想要一個純文本指針指向一個git倉庫中的文件,在特定的修訂版本 - 特別是修改相關文件的版本。在git中,是否有一個SHA1引用了路徑和修訂版的組合?

我可以做到這一點的一種方法是使用(path/to/file, revision)的元組,其中修訂是我可以從git log --format=oneline path/to/file獲得的東西。

有沒有更高效的方法來實現這個目標?

我知道git's object database stores filenames separately from file data,但是有沒有辦法將文件名轉換爲該對象ID並返回?

回答

4

git rev-parse變成顯然,困難的部分容易:

$ git rev-parse ace6325:Documentation/RelNotes/2.5.0.txt 
994b113178d966f7044ebe7b17d981df26ecd022 

你不需要原始SHA-1,任何語法分析修訂將做到:

$ git rev-parse HEAD~5:Documentation/RelNotes/2.5.0.txt 
994b113178d966f7044ebe7b17d981df26ecd022 

鑑於SHA- 1,git cat-file -p將提取其內容(或者您也可以使用git show以及; git show可能嘗試應用塗抹過濾器;我不完全確定要使用git show)。請注意,這個SHA-1是文件的實際內容的校驗和,即如果文件在一次提交中被改變,然後在稍後的提交中改回,則SHA-1將恢復到舊的SHA-1。

+0

所以,你可以把'994b113178d966f7044ebe7b17d981df26ecd022'回一個版本和路徑? – Ian

+0

不,沒有保證的唯一反轉(該文件可能出現在數百萬次提交中)。而且,正如我上面提到的,它可能會消失,然後重新出現。 – torek

3

是的。好吧,有點。在git中,文件被內部存儲爲一個稱爲blob的東西。 Blob由SHA-1以非常類似於提交的方式來標識。您可以使用git hash-object根據其內容來查找SHA-1的任何文件:

git hash-object -- <path> 

如果你想找到在一個特定的修訂版本文件的哈希,git hash-object也接受從標準輸入文件的內容:

git show <revision>:<path> | git hash-object --stdin 

然後你可以檢索文件與git show文:

git show <blob sha-1> 

從BLOB ID美聯社展望ath和修訂要困難得多。 Blob可以跨多個修訂版存儲在多個路徑中,因此實際上沒有存儲blob的單個確定路徑/修訂版組合。可以找到哪些修訂和路徑包含給定blob的列表(請參閱Which commit has this blob?),但這太複雜了,並且聽起來不像您想要的那樣。

如果你真的想在某個特定的版本文件的文本表示,那麼你原來的(<path>, <revision>)想法似乎完全合理的我。 <revision>:<path>也將很好地工作,因爲這是由git show接受的格式(如在實施例證明以上)。

+0

我唯一使用修訂的猶豫是,對於一個足夠老的文件,'git show HEAD:README。md | git hash-object --stdin'與'git show HEAD ^^^:README.md |相同git hash-object --stdin'。換句話說,我對同一事物有多個有效的標識符保持警惕。 – Ian

+0

@Ian然後不要使用'HEAD'作爲修訂。使用提交SHA-1或其他不會更改的內容,如標籤名稱。 – Ajedi32

+0

@Ian另外,您可以使用'git rev-parse'將類似'HEAD'的版本轉換爲更持久的版本。例如。 'git rev-parse HEAD'會給你當前提交的SHA-1,而不像'HEAD',SHA-1不會改變。 – Ajedi32

相關問題