2013-02-21 112 views
23

我有一個.tex文件的版本,來自我希望獲得副本的許多提交。我有提交的sha1哈希值,它具有我想要的那個文件的版本。我不想替換當前版本的文件。相反,我只想得到一個反映其舊版本狀態的單獨副本。如何在git存儲庫中獲取舊版本文件的副本?

很多類似的問題都建議使用git checkout <sha1> -- file.tex,但這只是繼續給出「錯誤:pathspec'file.tex'與git已知的任何文件都不匹配。

我感興趣的文件最初存在於存儲庫的頂級目錄中。我目前處於存儲庫的子目錄中,試圖運行此命令,以便在子目錄中獲取舊版本的file.tex。

這可能嗎?我怎樣才能做到這一點?

+0

製作當前文件的副本,然後運行'git checkout file.ext'? – adamdunson 2013-02-21 05:59:52

+0

我確切的用例。乾杯! – 2017-10-02 23:05:50

回答

39

您可以使用git cat-file到文件的內容轉儲到標準輸出和重定向到你想要的目的地:

git cat-file -p <sha1>:./file.tex > wherever.tex 

./是必要的如果您位於存儲庫的子目錄中,如果您位於存儲庫的頂層,則可能會被忽略。另外,這在舊版本的git中可能不起作用,在這種情況下,您需要明確提供文件相對於存儲庫根目錄的完整路徑。

+0

謝謝,這正是我一直在尋找的功能。 – jbranchaud 2013-02-21 08:42:15

+1

請注意,與許多其他git命令不同,文件名(此處爲「file.tex」)必須是來自git repo根目錄的名稱;所以如果你想要foo/file.tex,並且你在子目錄foo中,你不能輸入上面的內容,你必須輸入:foo/file.tex,儘管你已經在foo中了。 – Daniel 2013-09-28 01:56:39

+0

@丹尼爾,那是真的。但是,至少在最近的git版本中,您始終可以使用'.'來引用當前目錄。我已經更新了我的答案以反映這一點。 – qqx 2013-09-28 12:18:34

5

我認爲最好的解決方案是暫時覆蓋你的文件。在你的資料庫的頂層:

git checkout <sha1> file.tex 
cp file.tex directory 
git checkout file.tex 
+0

這是迄今爲止我所見過的最佳解決方案。我仍然很惱火,似乎沒有辦法直接抓住那個文件。 – jbranchaud 2013-02-21 06:04:10

+3

最後一條命令需要'git checkout HEAD file.tex'。第一個簽出命令會修改索引以及工作樹副本,因此在沒有指定修訂版的情況下籤出仍然會使用舊版本。 – qqx 2013-02-21 07:00:06

相關問題