2010-03-28 42 views
2

我希望能夠傳遞任何東西到一個git命令(也許它是一個SHA,也許它只是像「origin/master」或「devel/epxerimental」等),並且git告訴我分支的ref路徑通過的東西生活在,例如如何獲得git SHA的關聯ref路徑?

<git_command> 0dc27819b8e9 => output: refs/heads/master 
<git_command> xyz/test => output: refs/remotes/xyz/master 
... 

我一直在尋找git showgit loggit rev-parse而且除了--pretty=format:%d我無法找到任何東西。 (--pretty=format:%d輸出很奇怪,有很多可用空間和空行,有時一條以上的ref路徑聚集在一起)。

必須有更好的方法?

感謝您的閱讀。

安德烈

回答

5

有其中將記錄這樣的數據,因爲SHA1不是在所有的時間與參考路徑相關聯的沒有固定的信息。
分支可以移動時,重命名或刪除,而SHA1仍將存儲(除非它不被任何參考圖案引用,它最終會被修剪)

這就是說:

git show-ref |grep yourSHA1|awk "{print $2}" 
git show-ref --heads --tags -d |grep yourSHA1|awk "{print $2}" 

談到非常接近YOUT想要的東西:

C:\Prog\Git\tests\rep\main5>git show-ref | grep f4a071 | awk "{print $2}" 
refs/heads/master 
refs/remotes/origin/HEAD 
refs/remotes/origin/master 

很多選項可用於git show-ref和將允許您:

  • 顯示器也提領SHA1只有
  • 顯示SHA1
  • 對裁判的模式

的OP補充說:

它將返回什麼都沒有,如果一個SHA傳遞不引用一個頭或任何其他無法提交的提交?
你知道我們如何做中間步驟來計算出與SHA通過的屬於同一分支的最近提交的SHA嗎?

另外一個管道命令,可以幫助將git name-rev

C:\Prog\Git\tests\rep\main5>git name-rev a7768453 
a7768453 patches~1 

C:\Prog\Git\tests\rep\main5>git name-rev a7768453|gawk "{gsub(/~.*/,\"\",$2);print $2} 
patches 

由於Jefromi提到的意見,瓷命令將git branch --contain

C:\Prog\Git\tests\rep\main5>git branch --contain 1e73e369 
    master 
* patches 
    tmp 

--contains <commit> 

只列出包含s的分支特定的承諾。
如果<commit>需要重新設計或修改,它用於查找所有需要特別注意的分支,因爲這些分支包含指定的<commit>

+0

非常感謝,你是對的,它至少在10次中接近9次。 唯一的問題是:如果傳遞的SHA沒有引用頭或任何其他無法提交的提交,它將不會返回任何內容? 您知道我們如何做中間步驟來計算出與SHA傳遞屬於同一分支的最近提交的SHA的SHA(例如,如果我們通過SHA提交32,我們得到SHA返回提交0 (又名HEAD))? – andreb 2010-03-28 12:58:23

+1

@andreb:好點。 'show-ref'僅適用於由refs直接引用的SHA1引用。 'name-rev'可以幫助找到其他人。看到我更新的答案。 – VonC 2010-03-28 13:12:49

+0

@andreb:另請參閱http://stackoverflow.com/questions/917102/in-git-is-there-a-way-to-get-the-friendly-name-for-an-arbitrary-commit瞭解更多 – VonC 2010-03-28 13:19:38