![](/img/trans.png)
[英]git chaining: git push from local updated remote's remotes ref. Why and how was it possible?
[英]Is it possible to see a remote's remotes in git?
我有一個本地git clone
回購git clone
。 我當然可以看到我的本地遠程, origin
使用git remote
。 不過,我可以看到我的遙控器,遙控器的origin
? 我可以看到有關這些遙控器的任何詳細信息嗎,例如URL?
一般而言,除了通過注釋中的方法(通過ssh
到服務器並在其中運行git remote
)之外,其他方法都不是。
但是,您可以查看遙控器的全部1個 參考 ,包括其自己的遠程跟蹤分支,並且從此信息中您可以做出一些不錯的猜測:
$ git ls-remote
From ssh:[redacted]
d1574b852963482d4b482992ad6343691082412f HEAD
222c4dd303570d096f0346c3cd1dff6ea2c84f83 refs/heads/branch
d1574b852963482d4b482992ad6343691082412f refs/heads/master
d1574b852963482d4b482992ad6343691082412f refs/remotes/foo/bar
d41117433d7b4431a188c0eddec878646bf399c3 refs/tags/tag-foo
上面的內容暗示所討論的計算機必須具有一個名為foo
的遠程計算機(從該計算機獲得了分支bar
,重命名為refs/remotes/foo/bar
)。 實際上,它不是,因為我在此之前手動創建了該遠程跟蹤分支:
$ cd ~/tmp/t
$ git update-ref refs/remotes/foo/bar master
$ git for-each-ref
222c4dd303570d096f0346c3cd1dff6ea2c84f83 commit refs/heads/branch
d1574b852963482d4b482992ad6343691082412f commit refs/heads/master
d1574b852963482d4b482992ad6343691082412f commit refs/remotes/foo/bar
d41117433d7b4431a188c0eddec878646bf399c3 commit refs/tags/tag-foo
1遙控器現在可以隱藏特定參考; 您實際上只會看到他們允許的那些。 默認設置是允許所有。
順便說一句,我發現即使沒有刪除git update-ref -d
也會成功退出(我使用git update-ref -d
刪除了refs/remotes/foo/bar
但首先在錯誤的repo中運行了它)。 這導致發現另一個小錯誤:
$ nullsha=0000000000000000000000000000000000000000
$ git update-ref -d refs/remotes/foo/bar $nullsha || echo bug
(無輸出,很好:我們成功地“刪除”了它,同時期望它最初不存在)。
$ git update-ref -d refs/remotes/foo/bar master && echo bug
error: cannot lock ref 'refs/remotes/foo/bar': unable to resolve
reference refs/remotes/foo/bar: No such file or directory
奇怪:刪除應該 (並且確實)失敗,因為ref不存在,更不用說匹配master
,但這是一個很奇怪的消息。 (順便說一句,我為了發布目的而分拆長行。)
$ mastersha=$(git rev-parse master)
$ git update-ref -d refs/remotes/foo/bar $mastersha
相同的失敗消息; 似乎您不能提供非零的預期SHA1並出現“安靜”故障。 (實際的name-or-SHA-1無關緊要,除了全零的“ null hash”表示“不存在”(通常在Git中就是這種情況)。)
關於創建,我們可以期望使用null哈希來確保我們是創建引用的嗎?
$ git update-ref refs/remotes/foo/bar $mastersha $nullsha || echo bug
沒有輸出,很好:它應該僅在新的情況下創建,因此讓我們再試一次並確保創建報告的狀態為非零:
$ git update-ref refs/remotes/foo/bar $mastersha $nullsha && echo bug
fatal: update_ref failed for ref 'refs/remotes/foo/bar': cannot
lock ref 'refs/remotes/foo/bar': ref refs/remotes/foo/bar is at
11ae6ca18f6325c858f1e3ea2b7e6a045666336d but expected
0000000000000000000000000000000000000000
沒有實際的錯誤,但另一個奇怪的消息。 這至少是有道理的 。
如果我們要求刪除它,而我們希望不刪除它,該怎么辦?
$ git update-ref -d refs/remotes/foo/bar $nullsha && echo bug
bug
糟糕,我們可以將其刪除! 因此,請勿為此目的使用null哈希; 沒有使用null哈希的atomic-delete操作,只有atomic-create。 (如果我們提供了其他有效但不是$mastersha
hash,則git update-ref -d
正確失敗;因此原子刪除是一個兩步操作:解析以獲取哈希,然后嘗試使用該哈希進行刪除。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.