Kami menggunakan tag di git sebagai bagian dari proses penerapan kami. Dari waktu ke waktu, kami ingin membersihkan tag ini dengan menghapusnya dari repositori jarak jauh kami.
Ini sangat mudah. Satu pengguna menghapus tag lokal dan tag jarak jauh dalam satu set perintah. Kami memiliki skrip shell kecil yang menggabungkan kedua langkah.
Pengguna ke-2 (ke-3, ke-4, ...) sekarang memiliki tag lokal yang tidak lagi tercermin pada remote.
Saya mencari perintah yang mirip dengan git remote prune origin
yang membersihkan cabang pelacakan lokal yang cabang jauh telah dihapus.
Atau, perintah sederhana untuk membuat daftar tag jarak jauh dapat digunakan untuk membandingkan dengan tag lokal yang dikembalikan via git tag -l
.
git config fetch.pruneTags true
akan membuat Andagit fetch
melakukan apa yang Anda inginkan! Lihat jawaban saya untuk pertanyaan lain ini .Jawaban:
Pertanyaan bagus. :) Saya tidak punya jawaban yang lengkap ...
Yang mengatakan, Anda bisa mendapatkan daftar tag jarak jauh via
git ls-remote
. Untuk daftar tag di repositori yang dirujuk olehorigin
, Anda harus menjalankan:Itu mengembalikan daftar hash dan nama tag ramah, seperti:
Anda tentu bisa membuat skrip bash untuk membandingkan tag yang dihasilkan oleh daftar ini dengan tag yang Anda miliki secara lokal. Lihatlah
git show-ref --tags
, yang menghasilkan nama tag dalam bentuk yang sama sepertigit ls-remote
).Selain itu,
git show-ref
memiliki opsi yang melakukan kebalikan dari apa yang Anda inginkan. Perintah berikut akan mencantumkan semua tag pada cabang jarak jauh yang tidak Anda miliki secara lokal:sumber
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
Ini pertanyaan yang bagus, saya bertanya-tanya tentang hal yang sama.
Saya tidak ingin menulis naskah sehingga mencari solusi yang berbeda. Kuncinya adalah menemukan bahwa Anda dapat menghapus tag secara lokal, lalu gunakan git fetch untuk "mendapatkannya kembali" dari server jarak jauh. Jika tag tidak ada pada remote, maka tag akan tetap terhapus.
Jadi, Anda perlu mengetik dua baris dalam urutan:
Ini:
Hapus semua tag dari repo lokal. FWIW, xargs menempatkan setiap keluaran tag dengan "tag -l" pada baris perintah untuk "tag -d". Tanpa ini, git tidak akan menghapus apa pun karena tidak membaca stdin (silly git).
Ambil semua tag aktif dari repo jarak jauh.
Ini bahkan berfungsi memperlakukan Windows.
sumber
git tag prune origin
perintah.git tag -l | %{git tag -d $_}
untuk mendapatkan ini berfungsi di PowerShell. Tidak yakin tentang orang lain.Dari Git v1.7.8 hingga v1.8.5.6, Anda dapat menggunakan ini:
Memperbarui
Ini tidak berfungsi pada versi git yang lebih baru (dimulai dengan v1.9.0) karena komit e66ef7ae6f31f2 . Saya tidak benar-benar ingin menghapusnya karena itu berhasil bagi sebagian orang.
Seperti yang disarankan oleh "Chad Juliano", dengan semua versi Git sejak v1.7.8, Anda dapat menggunakan perintah berikut:
Anda mungkin perlu melampirkan bagian tag dengan tanda kutip (pada Windows misalnya) untuk menghindari ekspansi wildcard:
sumber
git fetch --prune <remote> +refs/tags/*:refs/tags/*
tidak bekerja di ZSH namun bekerja di BASH*
tetapi jika Anda mengutip tunggal bahwa itu harus baik-baik saja.git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
pangkas cabang dan tag pelacakan jarak jauh. check in versi git 2.18.Jika Anda hanya ingin tag yang ada di remote, cukup hapus semua tag lokal Anda:
Dan kemudian ambil semua tag jarak jauh:
sumber
xargs
. Jika Anda memiliki lebih banyak tag daripadaARG_MAX
, atau batasan serupa, ini tidak akan berfungsi. Tidak mungkin, tetapi mungkin, dan itu sebabnyaxargs
hebat.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Perintah alias wajib. Nikmati. :-)Sepertinya versi terbaru dari Git (I'm on git v2.20) memungkinkan seseorang untuk hanya mengatakan
Jauh lebih bersih!
https://git-scm.com/docs/git-fetch#_pruning
Anda juga dapat mengonfigurasi git untuk selalu memangkas tag saat mengambil:
Jika Anda hanya ingin memangkas tag saat mengambil dari jarak jauh tertentu, Anda dapat menggunakan
remote.<remote>.pruneTags
opsi. Misalnya, untuk selalu memangkas tag saat mengambil dari tempat asal tetapi tidak dari jarak jauh lainnya,sumber
Semua versi Git sejak v1.7.8 mengerti
git fetch
dengan refspec, sedangkan sejak v1.9.0--tags
opsi menimpa--prune
opsi. Untuk solusi tujuan umum, coba ini:Untuk membaca lebih lanjut tentang bagaimana perilaku "--tags" dengan "--prune" berubah di Git v1.9.0, lihat: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
sumber
origin
denganupstream
dan git mengoreksi tag lokal saya berdasarkan hulu; selanjutnyagit push origin :<deleted-tag-name>
memperbarui garpu GitHub saya, menghapus tag yang dihapus.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
ATAUgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ATAUgit fetch <url of origin> --prune --prune-tags
ATAUgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git secara alami mendukung pembersihan tag lokal:
Perintah ini menarik tag terbaru dan menghapus semua tag yang dihapus.
sumber
ini adalah metode yang baik:
git tag -l | xargs git tag -d && git fetch -t
Sumber: demisx.GitHub.io
sumber
Tampilkan perbedaan antara tag lokal dan jarak jauh:
git tag
memberikan daftar tag lokalgit ls-remote --tags
memberikan daftar path lengkap ke tag jarak jauhcut -f2 | grep -v '\^' | sed 's#refs/tags/##'
mem-parsing hanya nama tag dari daftar jalur tag jarak jauhBaris yang dimulai dengan "<" adalah tag lokal Anda yang tidak lagi di repo jarak jauh. Jika jumlahnya sedikit, Anda dapat menghapusnya secara manual satu per satu, jika jumlahnya banyak, Anda melakukan lebih banyak pengambilan dan pemipaan untuk mengotomatiskannya.
sumber
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, tetapi angka diikuti oleh koma dan kemudian apa yang tampak seperti tiga karakter pertama dari hash komit (?), misalnya7,8d4
...Baru saja menambahkan perintah git sync-local-tag ke pivotal_git_scripts Gem fork di GitHub:
https://github.com/kigster/git_scripts
Instal gem, lalu jalankan "git sync-local-tag" di repositori Anda untuk menghapus tag lokal yang tidak ada pada remote.
Atau Anda dapat menginstal skrip ini di bawah ini dan menyebutnya "git-sync-local-tag":
sumber
Saya tahu saya terlambat ke pesta, tapi sekarang ada jawaban cepat untuk ini:
Ya, sekarang merupakan opsi untuk mengambil.
Jika Anda tidak ingin mengambil, dan cukup pangkas:
sumber
Bagaimana dengan ini - jatuhkan semua tag lokal dan ambil kembali? Mempertimbangkan repo Anda mungkin mengandung submodul:
sumber
TortoiseGit dapat membandingkan tag sekarang.
Log kiri di remote, kanan di lokal.
Menggunakan fitur Bandingkan tag pada dialog Sync:
Juga lihat masalah TortoiseGit 2973
sumber
Jawaban yang sama dengan @Richard W tetapi untuk Windows (PowerShell)
sumber
Saya menambahkan perintah
SourceTree
sebagai Tindakan Kustom pada MacOS saya.Pengaturan
Custom Actions
olehSourcetree
->Preferences...
->Custom Actions
Script to run
harus menjadigit
jalan.Saya gunakan
git fetch --prune --prune-tags origin
untuk menyinkronkan tag dari jarak jauh ke lokal.sumber
Dalam versi git baru (seperti v2.26.2)
Jadi, Anda perlu menjalankan:
sumber