2017-02-16 24 views
-1

我有一個文件和一個文件的存儲庫,我知道它來自它,但我不確定標記/分支。我知道存儲庫中的文件名。在git repostiory中識別文件版本的最接近標記

有沒有一種簡單的方法來搜索git樹來找到最近的分支/標籤文件來自?

編輯:完整的場景來解釋爲什麼。

我們有一個模板庫。這些模板有時被另一個程序使用,當它們被使用時,它們將從主模板存儲庫中檢出,而沒有任何git歷史記錄。

快進到現在,我們希望能夠以編程方式更新所有使用這些模板的位置,但是對於其中的很多,我們不知道實際使用哪個版本以及可能必須發生哪些更新代碼的其餘部分允許無縫更新。因此,我們要做的是找出最接近的標籤(a-la git描述)是否適用於特定模板的特定版本。從那裏,我們可以根據需要安排其他更新。

所以我有一個模板的副本,我知道它來自我的回購,但我不知道它是什麼時候發生的。

+0

'git log --reverse the-filename'? – Ryan

+0

這給了我更改文件的提交日誌,但是我想要的是它查看MD5並查找該MD5第一次出現的文件名。我想我可以通過git-log循環訪問文件,並在每次提交時檢查文件的MD5並查看它何時出現。儘管如此,這不會吸引未分化的分行。 –

+2

你想...通過其MD5哈希搜索文件?你沒有把這個與Git的SHA-1提交ID進行混合?你還必須解釋什麼「最接近的分支/標籤」的意思是...... – Ryan

回答

1

好的,所以你有一些內容,你想找到歷史上的哪一點,內容出現在回購中的給定路徑。

你提到了一些關於MD5的東西;也許你的意思是git使用的散列(實際上是一個SHA1),但即使你沒有使用git的散列也是如此。請注意,您不能僅使用任何實用程序來計算SHA1,因爲git會將內容頭附加到內容,並且可能會在計算哈希值之前應用一些過濾器。所以:

git hash-object file-containing-the-target-content 

並記下它給你的SHA1。

接下來您需要包含文件sha1的日誌輸出。一種方法是

git log --raw --no-abbrev --all --full-history --reverse -- path/to/file/in/repo 

並搜索輸出以查找上面找到的第一個sha1值。 (可能有一種方法可以自動搜索內容;我正在考慮這個問題,但由於某種原因,它並不是點擊,但只是捕獲日誌或將其滾動到較少的位置,然後搜索sha1值,將無法工作太麻煩了。)

也許這正是你需要做的......但說實話,我想不出應用這種技術會是什麼。如果您想知道某個特定位的內容何時進入回購站,那麼使用git blame可能會更有成效。

+0

這是一個變體...因爲您在關於未合併分支的評論中說了些什麼,讓我覺得你可能不得不處理內容是否被引入超過一次。通過上面的日誌輸出,每個條目都會列出「之前的SHA1」,然後是「之後的SHA1」,因此您可以繼續尋找第二個SHA1與您的目標內容匹配的每一行。每個包含這種記錄的提交都是一個提交內容的提交。 –

+0

您可以通過'|管道輸出'git log'輸出(export HL = $(echo -e'\ 033 [41m \ 033 [37m'); export EL = $(echo -e'\ 033 [0m'); sed「s//$ {HL} \ 0 $ {EL} /克「)';如果你想保留日誌着色,你需要在'git log'中加入'--color = always'。 – Pockets

+0

謝謝,我會試試這個。我在問題中增加了一些額外的細節,以說明我正在尋找的內容以及爲什麼。 –

0

我打算單獨發佈這個,因爲@ mark-adelsberger讓我大部分時間都在那裏,但並沒有完全實現。以下是如何從文件內容中找到文件提交併獲取最接近的標記:

hash=$(git hash-object file_of_unknown_origin) 
commit_hash=$(git log --raw --no-abbrev --all --full-history --reverse --format=format:%H -- path/to/file | sed 's/^:[0-9]* [0-9]* [a-z0-9]* //' | grep -B1 $hash | head -n 1) 
git checkout $commit_hash 
git describe --tags