我需要找出一個裁判提交的存在。有一件事幾乎可行,如果ref不存在,它有時會返回非零值(git show
)。但是,它也接受當前源樹中的路徑。所以,如果我有一個名爲master
文件,但裁判master
不存在,git show
成功。我一直無法找到更多具體的命令。的Git:如何確定一個裁判提交存在
我想的方法來接受:
分支- 名稱
編輯:我這樣做是因爲我想以編程方式對用戶輸入進行完整性檢查。
我需要找出一個裁判提交的存在。有一件事幾乎可行,如果ref不存在,它有時會返回非零值(git show
)。但是,它也接受當前源樹中的路徑。所以,如果我有一個名爲master
文件,但裁判master
不存在,git show
成功。我一直無法找到更多具體的命令。的Git:如何確定一個裁判提交存在
我想的方法來接受:
分支編輯:我這樣做是因爲我想以編程方式對用戶輸入進行完整性檢查。
您可以使用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
你似乎需要驗證用戶輸入是否是一個好辦法一個有效的提交參考。
git show [options] <object>
可以幫助你,如果你寫的更精確對象名稱描述here。例如有關於主設備的說明:
主設備通常表示由refs/heads/master引用的提交對象。如果你碰巧有頭部/主人和標籤/主人,你可以明確地說頭部/主人告訴Git你的意思。
更多有關git show
當我在命令行時,它可以工作,但我現在正在嘗試以編程方式清理用戶輸入。在我的程序正在執行檢查的時候,它不知道輸入的任何內容,只是它是輸入的字符串。 – timthelion
因此,考慮的東西解析爲現有的提交,你想找到指向它所有的裁判?
下似乎給你想要的東西:
git show-ref --head --heads --tags | grep `git rev-parse $THING`
我想完整地檢查用戶輸入。 show-ref實際上讓我獲得了一半。我現在可以檢查分支名稱或其他引用(如HEAD)是否存在/有效。我仍然不知道如何確定提交哈希是否存在。 – timthelion
如果要檢查所有的樹枝,可以使用git branch -a
列出所有的遠程和分支定位。
如果要檢查所有提交的哈希值,可以使用git log
列出所有的提交。
如果要檢查所有的標籤,你可以使用git tag -l
列出所有的標記名稱。
如果你想知道哪些提交你的頭點,你可以使用git rev-parse HEAD
檢查。並以this作爲參考。
如果您想了解更多,您可以檢查書Pro Git。
git log是否實際列出所有提交或僅鏈接到HEAD的那些提交?在其他分支提交呢? – timthelion
謝謝!看起來,「git cat-file -t」就是我正在尋找的東西:) – timthelion
請注意,它會爲標記返回'tag',所以您需要檢查它是否爲'commit'或'tag'在輸出中。 –
正是我需要的!很好找出你可以用'HEAD〜'返回多遠找到第一次提交 – xdevs23