簡體   English   中英

刪除從多個存儲庫中獲取的標簽

[英]Delete tags fetched from one repository of many

我有一個移植的開源項目,我想在新版本上更新它,所以我添加了包含項目必要更新的遠程存儲庫,但我弄錯了鏈接並添加了另一個,執行git fetch --all所以我獲取從遠程存儲庫到我的本地存儲庫的所有提交和標簽,然后添加正確的遠程存儲庫並獲取它,解決合並沖突並推送如果帶有標簽git push --tags ,所以我從兩個存儲庫獲得標簽。

如何從第一個遠程存儲庫中刪除標簽,這是錯誤的?

首先,注意: git fetch --all不會獲取所有分支,也不會獲取所有標簽。 它獲取它總是會獲取的相同分支和/或標簽。 --all在這里的意思是all remotes 也就是說,對於由git remotegit remote -v打印的每個遠程,它將運行一個git fetch到該遠程。 因此,這與實際問題無關,這只是您設置了一個您不希望的遠程 URL,並從該 URL 中獲取。

要從存儲庫中刪除某些特定的標簽集,使用git tag -d 此命令允許您指定多個標簽:

git tag -d tag1 tag2 tag3

將刪除所有三個標簽。

要請求其他存儲庫刪除標簽,請使用git push--delete或表示“刪除”的 refspec 語法。 也就是說,假設您想要求origin刪除標簽tag1tag2tag3 然后你想要:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM