pengembangan-web-mp-pd.com

membersihkan cabang git remote lama

Inilah alur kerja git saya.

Saya bekerja dari dua komputer yang berbeda (A dan B) dan menyimpan remote git yang umum di direktori dropbox.

Katakanlah saya memiliki dua cabang master dan devel. Keduanya melacak rekan jarak jauh mereka Asal/master dan Asal/devel.

Sekarang saat di komputer A, saya menghapus devel cabang - baik lokal maupun jarak jauh - sebagai berikut:

git Push Origin :heads/devel

git branch -d devel

Sekarang jika saya melakukan git branch -a di komputer A, saya mengerti

master
Origin/HEAD
Origin/master

Saya sekarang masuk ke komputer B. Lakukan git fetch. Saya dapat menghapus cabang devel lokal dengan

git branch -d devel

Tapi saya tidak bisa menghapus cabang devel jarak jauh.

git Push Origin :heads/devel

error: unable to Push to unqualified destination: heads/proxy3d
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
fatal: The remote end hung up unexpectedly

Melakukan git branch -a masih mencantumkan Origin/devel di cabang jauh.

Bagaimana saya bisa membersihkan entri remote devel dari mesin B?

564
Jayesh

Pertama, apa hasil git branch -a pada mesin B?

Kedua, Anda telah menghapus heads/devel pada Origin, jadi itu sebabnya Anda tidak dapat menghapusnya dari mesin B.

Mencoba

git branch -r -d Origin/devel

atau

git remote Prune Origin

atau

git fetch Origin --Prune

dan jangan ragu untuk menambahkan --dry-run ke akhir pernyataan git Anda untuk melihat hasil menjalankannya tanpa benar-benar menjalankannya. 

1069
Jakub Narębski

Pertimbangkan untuk menjalankan:

git fetch --Prune

Secara teratur di setiap repo untuk menghapus cabang lokal yang telah melacak cabang jauh yang dihapus (tidak ada lagi di repo GIT jarak jauh).

Ini dapat disederhanakan dengan

git config remote.Origin.Prune true

ini adalah pengaturan per-repo yang akan membuat git fetch or git pull di masa depan menjadi secara otomatis Prune .

Untuk mengatur ini untuk pengguna Anda, Anda juga dapat mengedit .gitconfig global dan menambahkan

[fetch]
    Prune = true

Namun, disarankan agar ini dilakukan dengan menggunakan perintah berikut:

git config --global fetch.Prune true

atau menerapkannya secara luas (tidak hanya untuk pengguna)

git config --system fetch.Prune true
67
Arif

Berikut ini skrip bash yang dapat melakukannya untuk Anda. Ini versi modifikasi dari script http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Modifikasi saya memungkinkannya untuk mendukung lokasi terpencil yang berbeda.

#!/bin/bash

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching merged branches...\n"

git remote update --Prune
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ -n "$remote_branches" ]; then
echo "$remote_branches"
  fi
  if [ -n "$local_branches" ]; then
echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    remotes=`echo "$remote_branches" | sed 's/\(.*\)\/\(.*\)/\1/g' | sort -u`
# Remove remote branches
for remote in $remotes
do
        branches=`echo "$remote_branches" | grep "$remote/" | sed 's/\(.*\)\/\(.*\)/:\2 /g' | tr -d '\n'`
        git Push $remote $branches 
done

# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/Origin\///g' | tr -d '\n'`
  else
echo "No branches removed."
  fi
fi
14
Alex Amiryan

Perintah ini akan "dry run" menghapus semua cabang gabungan (Origin) jarak jauh, selain master. Anda bisa mengubahnya, atau, tambahkan cabang tambahan setelah master: grep -v for-example-your-branch-here |

git branch -r --merged | 
  grep Origin | 
  grep -v '>' | 
  grep -v master | 
  xargs -L1 | 
  awk '{sub(/Origin\//,"");print}'| 
  xargs git Push Origin --delete --dry-run

Jika terlihat bagus, hapus --dry-run. Selain itu, Anda mungkin ingin menguji ini menggunakan garpu terlebih dahulu.

7
weston

Jika git branch -r menunjukkan banyak cabang pelacak jarak jauh yang tidak Anda minati dan Anda ingin menghapusnya hanya dari lokal, gunakan perintah berikut:

git branch -r | grep -Ev 'HEAD|master|develop'  | xargs -r git branch -rd

Versi yang lebih aman hanya dengan menghapus yang digabungkan:

git branch -r --merged | grep -Ev 'HEAD|master|develop'  | xargs -r git branch -rd

Ini mungkin berguna untuk proyek-proyek besar, di mana Anda tidak memerlukan cabang fitur rekan tim lain tetapi memiliki banyak cabang pelacakan jarak jauh diambil pada klon awal.

Dan langkah ini saja tidak lengkap karena cabang-cabang pelacakan jarak jauh yang dihapus akan muncul lagi pada git fetch berikutnya. 

Untuk berhenti mengambil cabang-cabang pelacakan jarak jauh Anda perlu secara eksplisit menentukan referensi untuk mengambil di .git/config :

[remote "Origin"]
  # fetch = +refs/heads/*:refs/remotes/Origin/*
  fetch = +refs/heads/master:refs/remotes/Origin/master
  fetch = +refs/heads/develop:refs/remotes/Origin/develop
  fetch = +refs/heads/release/*:refs/remotes/Origin/release/*

Dalam contoh di atas kami hanya mengambil master, develop dan melepaskan cabang, merasa bebas dan menambahkan milik Anda.

3
ryenus

Penghapusan selalu merupakan tugas yang menantang dan bisa berbahaya !!! Oleh karena itu, pertama jalankan perintah berikut untuk melihat apa yang akan terjadi:

git Push --all --Prune --dry-run

Dengan melakukan seperti di atas, git akan memberi Anda daftar apa yang akan terjadi jika perintah di bawah ini dijalankan.

Kemudian jalankan perintah berikut untuk menghapus semua cabang dari repo jarak jauh yang tidak ada dalam repo lokal Anda:

git Push --all --Prune

Berikut ini cara melakukannya dengan SourceTree (v2.3.1):
1. Klik Ambil
2. Periksa "Cabang pelacakan prune ..."
3. Tekan OK
4. ???? 

 enter image description here

2
coco

Saya harus menambahkan jawaban di sini, karena jawaban yang lain tidak mencakup kasus saya atau tidak perlu rumit . Saya menggunakan github dengan pengembang lain dan saya hanya ingin semua cabang lokal yang memiliki remote (mungkin digabung dan) dihapus dari PR github yang akan dihapus sekaligus dari mesin saya. Tidak, hal-hal seperti git branch -r --merged tidak mencakup cabang-cabang yang tidak digabungkan secara lokal, atau cabang-cabang yang tidak bergabung sama sekali (terbengkalai, dll), sehingga diperlukan solusi yang berbeda.

Bagaimanapun, langkah pertama yang saya dapatkan dari jawaban lain:

git fetch --Prune

Jalankan git remote Prune Origin kering sepertinya akan melakukan hal yang sama dalam kasus saya, jadi saya pergi dengan versi terpendek agar tetap sederhana.

Sekarang, git branch -v harus menandai cabang yang remote-nya dihapus sebagai [gone]. Karena itu, yang perlu saya lakukan adalah:

git branch -v|grep \\[gone\\]|awk '{print $1}'|xargs -I{} git branch -D {}

Sesederhana itu, menghapus semua yang saya inginkan untuk skenario di atas.

Sintaks xargs yang kurang umum adalah sehingga ia juga bekerja di Mac & BSD selain Linux . Hati-hati, perintah ini bukan proses yang berjalan sehingga akan menghapus paksa semua cabang yang ditandai sebagai [gone]. Jelas, ini git tidak ada yang hilang selamanya, jika Anda melihat cabang dihapus yang Anda inginkan disimpan Anda selalu dapat membatalkan penghapusan mereka (perintah di atas akan mendaftarkan hash mereka pada penghapusan, jadi git checkout -b <branch> <hash> sederhana.

1
Ecuador