2016-01-06 22 views
2

我需要找出一個裁判提交的存在。有一件事幾乎可行,如果ref不存在,它有時會返回非零值(git show)。但是,它也接受當前源樹中的路徑。所以,如果我有一個名爲master文件,但裁判master不存在,git show成功。我一直無法找到更多具體的命令。的Git:如何確定一個裁判提交存在

我想的方法來接受:

分支
  • 提交哈希
  • 標籤
  • 關鍵詞狀頭部的
    • 名稱

    編輯:我這樣做是因爲我想以編程方式對用戶輸入進行完整性檢查。

  • 回答

    4

    您可以使用git rev-parse--verify標誌來解析各種ref並將它們解碼爲它們的SHA-1散列值。這將擺脫所有無效的裁判,也文件路徑:

    $ git rev-parse --verify HEAD 
    a93775d7fcd9bf27bbd89ee69e84a03e06223e9b 
    $ git rev-parse --verify HEAD~2 
    4100b19c32fac3e2c0838c85d180cd4f50500c2f 
    $ git rev-parse --verify master 
    e88352936f4ffc703cdfb0da95ad5592456feb0b 
    $ git rev-parse --verify origin/master 
    e88352936f4ffc703cdfb0da95ad5592456feb0b 
    $ git rev-parse --verify README.md 
    fatal: Needed a single revision 
    $ git rev-parse --verify doesnotexist 
    fatal: Needed a single revision 
    

    注意,這會不幸地也接受其他對象類型,例如樹:

    $ git rev-parse --verify "HEAD^{tree}" 
    5fdca9a3c0db1e1414229a7b50dac20e4e87a3b8 
    

    你可以做的是使用git cat-file,因爲這直接作用於Git的對象數據庫。所以它只能找到實際存在的對象。它也解析你傳遞給它的任何修改參數,所以它可以理解各種引用。通過使用-t參數,它將爲您提供您傳遞的對象的類型。如果該類型被提交,那麼無論你傳遞是指定一個有效的途徑現有承諾:

    $ git cat-file -t HEAD 
    commit 
    $ git cat-file -t HEAD~2 
    commit 
    $ git cat-file -t master 
    commit 
    $ git cat-file -t origin/master 
    commit 
    $ git cat-file -t README.md 
    fatal: Not a valid object name README.md 
    $ git cat-file -t doesnotexist 
    fatal: Not a valid object name doesnotexist 
    $ git cat-file -t "HEAD^{tree}" 
    tree 
    

    所以只檢查是否返回commit你似乎需要驗證用戶輸入是否是一個好辦法一個有效的提交參考。

    +0

    謝謝!看起來,「git cat-file -t」就是我正在尋找的東西:) – timthelion

    +0

    請注意,它會爲標記返回'tag',所以您需要檢查它是否爲'commit'或'tag'在輸出中。 –

    +0

    正是我需要的!很好找出你可以用'HEAD〜'返回多遠找到第一次提交 – xdevs23

    0
    git show [options] <object> 
    

    可以幫助你,如果你寫的更精確對象名稱描述here。例如有關於主設備的說明:

    主設備通常表示由refs/heads/master引用的提交對象。如果你碰巧有頭部/主人和標籤/主人,你可以明確地說頭部/主人告訴Git你的意思。

    更多有關git show

    +0

    當我在命令行時,它可以工作,但我現在正在嘗試以編程方式清理用戶輸入。在我的程序正在執行檢查的時候,它不知道輸入的任何內容,只是它是輸入的字符串。 – timthelion

    0

    因此,考慮的東西解析爲現有的提交,你想找到指向它所有的裁判?

    下似乎給你想要的東西:

    git show-ref --head --heads --tags | grep `git rev-parse $THING` 
    
    +0

    我想完整地檢查用戶輸入。 show-ref實際上讓我獲得了一半。我現在可以檢查分支名稱或其他引用(如HEAD)是否存在/有效。我仍然不知道如何確定提交哈希是否存在。 – timthelion

    0

    如果要檢查所有的樹枝,可以使用git branch -a列出所有的遠程和分支定位。

    如果要檢查所有提交的哈希值,可以使用git log列出所有的提交。

    如果要檢查所有的標籤,你可以使用git tag -l列出所有的標記名稱。

    如果你想知道哪些提交你的頭點,你可以使用git rev-parse HEAD檢查。並以this作爲參考。

    如果您想了解更多,您可以檢查書Pro Git

    +0

    git log是否實際列出所有提交或僅鏈接到HEAD的那些提交?在其他分支提交呢? – timthelion

    相關問題