Pangkas otomatis dengan Git ambil atau tarik

248

Jika seseorang menghapus cabang jarak jauh karena pekerjaan sudah selesai dan saya tidak tahu, saya tidak akan melakukan git fetch --prune dan akhirnya saya akan mendorong kembali cabang yang dihapus.

Apakah ada solusi yang layak untuk memaksa Git menggunakan mode prune saat mengambil / menarik tanpa harus menentukannya setiap waktu?

Edmondo1984
sumber
1
Anda akan segera (git 1.8.5, Q4 2013) dapat menentukan dalam konfigurasi lokal repo yang Anda ingin selalu memangkas git fetch! Lihat jawaban saya di bawah ini
VonC

Jawaban:

395

Sejak git 1.8.5 (Q4 2013) :

" git fetch" (maka " git pull" juga) belajar untuk memeriksa " fetch.prune" dan " remote.*.prune" variabel konfigurasi dan bersikap seolah - olah " --prune" opsi baris perintah diberikan.

Itu berarti, jika Anda mengatur remote.origin.prune menjadi true:

git config remote.origin.prune true

Setiap git fetchatau git pullsecara otomatis akan memangkas.

Catatan: Git 2.12 (Q1 2017) akan memperbaiki bug yang terkait dengan konfigurasi ini, yang akan membuat git remote renamekesalahan.
Lihat " Bagaimana cara saya mengganti nama git remote? ".


Lihat lebih lanjut di komit 737c5a9 :

Tanpa " git fetch --prune", cabang pelacak jarak jauh untuk cabang yang sudah dilepas pihak lain akan tetap selamanya.
Beberapa orang ingin selalu menjalankan " git fetch --prune".

Untuk mengakomodasi pengguna yang ingin selalu memangkas atau mengambil dari jarak jauh tertentu, tambahkan dua variabel konfigurasi baru " fetch.prune" dan " remote.<name>.prune":

  • " fetch.prune" memungkinkan untuk mengaktifkan prune untuk semua operasi pengambilan.
  • " remote.<name>.prune" memungkinkan untuk mengubah perilaku per remote.

Yang terakhir akan secara alami menimpa yang pertama, dan --[no-]pruneopsi dari baris perintah akan menimpa default yang dikonfigurasi.

Karena --pruneberpotensi merusak operasi (Git belum menyimpan reflog untuk referensi yang dihapus), kami tidak ingin memangkas tanpa persetujuan pengguna, jadi konfigurasi ini tidak akan aktif secara default.

VONC
sumber
4
Ini memang termasuk dalam git 1.8.5
Bessey
1
Saya ingin perilaku ini secara default di semua repositori git saya. Apakah ada beberapa tempat saya dapat meletakkan ini di .gitconfig saya untuk mewujudkannya?
Andrew
47
@Andrew awal yang baik adalahgit config --global fetch.prune true
VonC
1
apa kemungkinan kerugian untuk selalu memangkas saat menarik? kutipan menyebutkan bahwa sejarah reflog dipengaruhi ... tetapi masalah praktis apa yang mungkin muncul?
Grapho
3
@Grapho tidak ada kerugian nyata tapi ... lihat lebih banyak di stackoverflow.com/a/39862779/6309
VonC
143

git config --global fetch.prune true

Untuk selalu --pruneuntuk git fetchdan git pulldi semua repositori Git Anda:

git config --global fetch.prune true

Perintah di atas ini ditambahkan dalam konfigurasi global Git Anda (biasanya ~/.gitconfig) baris berikut. Gunakan git config -e --globaluntuk melihat konfigurasi global Anda.

[fetch]
    prune = true

git config remote.origin.prune true

Selalu --prunedari satu repositori:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Perintah di atas ini menambahkan konfigurasi Git lokal Anda (biasanya .git/config) baris terakhir di bawah ini. Gunakan git config -euntuk melihat konfigurasi lokal Anda.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

Anda juga bisa menggunakan --globalperintah kedua atau menggunakan --localperintah pertama.


git config --global gui.pruneDuringFetch true

Jika Anda menggunakan, git guiAnda mungkin juga tertarik dengan:

git config --global gui.pruneDuringFetch true

yang menambahkan:

[gui]
    pruneDuringFetch = true

Referensi

Dokumentasi yang sesuai dari git help config :

--global

  Untuk opsi penulisan: tulis ke ~/.gitconfigfile global daripada repositori .git/config, tulis ke $XDG_CONFIG_HOME/git/configfile jika file ini ada dan ~/.gitconfigfile tidak.

 

--local

  Untuk opsi penulisan: tulis ke .git/configfile repositori . Ini adalah perilaku default.

 

fetch.prune

  Jika benar, fetch akan secara otomatis berperilaku seolah-olah --pruneopsi itu diberikan pada baris perintah. Lihat juga remote.<name>.prune.

 

gui.pruneDuringFetch

  "true" jika git-gui harus memangkas cabang pelacakan jarak jauh saat melakukan pengambilan. Nilai standarnya adalah "false".

 

remote.<name>.prune

  Jika disetel ke true, mengambil dari jarak jauh ini secara default juga akan menghapus referensi pelacakan jarak jauh yang tidak lagi ada pada jarak jauh (seolah-olah --pruneopsi diberikan pada baris perintah). Mengganti fetch.prunepengaturan, jika ada.

olibre
sumber
1
Catatan: Saya baru saja belajar tentang git config -edan git config -e --globaldari pos ini. Tidak ada lagi mengetik vimperintah untuk menunjuk ke path spesifik ke file git config, dan harus memikirkan apa path spesifik itu.
ecbrodie
1
Sekarang, ini adalah jawaban yang bisa Anda gunakan. Terima kasih banyak.
sebingel
Jawaban ini cukup menyeluruh, tetapi sangat sulit dibaca karena formatnya. Saya telah menemukan "Untuk selalu --menjalankan untuk git mengambil dan menarik semua repositori Git Anda: git config --global fetch.prune true" sama baiknya (dengan tautan ke dokumen yang relevan).
Thibaud Colas
19

Jika Anda ingin selalu pruneketika Anda fetch, saya dapat menyarankan untuk menggunakan Alias .

Cukup ketik git config -euntuk membuka editor Anda dan ubah konfigurasi untuk proyek tertentu dan tambahkan bagian seperti

[alias]
pfetch = fetch --prune   

ketika Anda mengambil dengan git pfetchprune akan dilakukan secara otomatis.

Terima kasih untuk semua ikan
sumber
Saya mengerti. Tarik dengan cara akan menggunakan git fetch dan bukan git pfetch ... haruskah saya langsung memiliki alias untuk menarik?
Edmondo1984
1
Aku akan. Dengan cara ini, Anda memiliki kedua opsi, normal pulldan fetchdan versi prun. Sebenarnya, saya pikir (tapi saya belum mencoba) Anda dapat menulis fetch = fetch --prunelangsung di bagian alias dan karena itu pullakan menggunakan pemangkasan mengambil secara otomatis
Terima kasihForAllTheFish
2
Sejauh yang saya tahu fetch = fetch --prunetidak berfungsi, menimpa perintah dengan alias tidak berfungsi untuk saya. Ini bisa jadi karena saya menggunakan versi lama (1.7.2.5)
Uipko
3
Dari dokumentasi git config: "Untuk menghindari kebingungan dan masalah dengan penggunaan skrip, alias yang menyembunyikan perintah Git yang ada diabaikan."
Dewayne Christensen