[英]Delete tags fetched from one repository of many
我有一個移植的開源項目,我想在新版本上更新它,所以我添加了包含項目必要更新的遠程存儲庫,但我弄錯了鏈接並添加了另一個,執行git fetch --all
所以我獲取從遠程存儲庫到我的本地存儲庫的所有提交和標簽,然后添加正確的遠程存儲庫並獲取它,解決合並沖突並推送如果帶有標簽git push --tags
,所以我從兩個存儲庫獲得標簽。
如何從第一個遠程存儲庫中刪除標簽,這是錯誤的?
首先,注意: git fetch --all
不會獲取所有分支,也不會獲取所有標簽。 它獲取它總是會獲取的相同分支和/或標簽。 --all
在這里的意思是all remotes 。 也就是說,對於由git remote
或git remote -v
打印的每個遠程,它將運行一個git fetch
到該遠程。 因此,這與實際問題無關,這只是您設置了一個您不希望的遠程 URL,並從該 URL 中獲取。
要從存儲庫中刪除某些特定的標簽集,請使用git tag -d
。 此命令允許您指定多個標簽:
git tag -d tag1 tag2 tag3
將刪除所有三個標簽。
要請求其他存儲庫刪除其標簽,請使用git push
和--delete
或表示“刪除”的 refspec 語法。 也就是說,假設您想要求origin
刪除其標簽tag1
、 tag2
和tag3
。 然后你想要:
git push --delete origin refs/tags/tag1 refs/tags/tag2 refs/tags/tag3
或者:
git push origin :refs/tags/tag1 :refs/tags/tag2 :refs/tags/tag3
您可以在每個 position 中省略refs/tags/
,但這會冒刪除名為tag2
的分支的風險,例如; 使用refs/tags/tag2
明確表示您希望origin
刪除其標簽tag2
。
@phd 是的,問題是如何刪除從錯誤存儲庫中獲取的標簽。 並且做起來容易,而不是一一刪除所有錯誤的標簽。
您仍然必須單獨刪除每個標簽。 您可以使用一個命令來做到這一點,但該命令必須列出要刪除的每個標簽。
要獲取您想要刪除的標簽列表,請考慮向具有不需要標簽的遙控器詢問其標簽列表:
git ls-remote --tags <name-or-URL>
您可能希望將此 output 重定向到文件。 在文本文件編輯器中打開文件,刪除所有以^{}
結尾的行,並刪除 hash ID 和初始refs/tags/
部分。 在 vim 中,例如:
vim /tmp/tags
:g/\^{}$/d
:%s,.*\trefs\/tags\/,,
會成功的。 您現在擁有該存儲庫中所有標簽的列表。
請注意,盲目假設應該刪除這些標簽可能是錯誤的! 其中一些標簽可能已經存在,並且仍然在您的存儲庫中命名正確的提交。 因此,您現在必須檢查這些標簽並確保您確實要刪除所有這些標簽。
獲得列表后,您可以再次使用xargs
(如果有)或文本編輯器來構建適當的git tag -d
和/或git push --delete
ZDBC11CAA5BDA99F77E6FB4DABD882ED7 例如:
sed 's,.*,git tag -d &,' < /tmp/tags
生成git tag -d
命令的完整列表; pipe 將此放入 shell 以使它們執行:
sed 's,.*,git tag -d &,' < /tmp/tags | sh
重復使用從標簽名稱構建git push --delete origin refs/tags/&
命令的替代品。 (何時以及是否將其優化為單個git push
取決於用戶。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.