varsayılan olarak push --force-with-lease


130

Yeni öğrendim git push --force-with-lease. Oldukça harika. Ama elbette, o kadar sık ​​güç kullanmıyorum ve bu yüzden, bir dahaki sefere ihtiyacım olduğunda bu şık özelliği unutabileceğimden endişeleniyorum.

Git'i yapılandırmanın bir yolu var mı git push -f, --force-with-leasekasıtlı olarak geçersiz kılmadıkça otomatik olarak kullanacak --no-force-with-leasemı?

(Kira sözleşmesi olmadan güç kullanmak isteyeceğimi hayal bile edemiyorum!)

Yanıtlar:


142

AFAIK git force-with-leaseyerine her zaman kullanmasını söyleyen bir yapılandırma yok force. Bu, bir özellik isteği için iyi bir örnek gibi görünüyor; Git kod tabanına dalmakta sorun yaşamıyorsanız, bunu kendiniz uygulayabilir ve incelemeye gönderebilirsiniz.

DÜZENLEME Halen, Nisan 2019'da bu hala geçerlidir.

O zamana kadar gördüğüm tek seçenek, sık sık aliasolduğu gibi, bu amaca hizmet eden bir tane yaratmak .

Bir takma ad oluşturun

Bir kişinin kullanacağı bir takma ad oluşturmak için git config --global alias.<alias-name> <command>, bizim durumumuzda buna benzer bir şey öneririm.

git config --global alias.pushf "push --force-with-lease"

Bu, genel .gitconfigdosyanızda (genellikle ana dizininizde bulabileceğiniz) bir girdi oluşturacaktır . Bundan sonra sadece kullanabilirsiniz git pushfetmek zorlamak-with-kira .

Ellerini kirlet

Özelliği kendiniz uygulamak istiyorsanız ancak nereden başlayacağınızdan emin değilseniz, önce git deposundaki dokümantasyon dizinine bir göz atmalısınız . Burada yamaların nasıl gönderileceğine dair kodlama yönergelerini ve bilgileri bulabilirsiniz .

Tüm bu bağlantıları ve daha fazlasını resmi topluluk sayfasında bulabilirsiniz .


25
Bunun bir özellik olmadığına dair bir not: Standart komutları yeniden yazmaya ("push --force") karşı ortak argüman, onlara alışmanız, kökenlerini unutmanız ve bir gün bunları yanlışlıkla yeni bir sistemde bu şekilde kullanmanızdır. Çok aliasing gibi rmhiç rm -i.bashrc içinde; Bir gün bir sunucudaki önemli bir dosyayı unutacak ve sileceksiniz. Kendi takma adınızla gitmek böyle bir soruna sahip değil :)
hraban

2
Kişisel anekdot / uyarı kelimesi: Takma ad vermeyi denedim, pushfancak push -ftakma ada benzediği için a yapmadığımı her zaman iki kez kontrol ettim . Bazı ekip üyeleri push -f, takma adın sadece kozmetik bir kısaltma olduğunu düşünerek yine de kullanıyorlardı . Nihayetinde, daha güvenli biçimi pushflbunun yerine değiştirdik ve endişelenmeyi bıraktık.
kelvin

31

Bir dahaki sefere ihtiyacım olduğunda bu şık özelliği unutabileceğimden endişeliyim.

Bu itme seçeneği karşı "koruma" sen bile, çünkü unutmuş orada neden Git 2.13 (Q2 2017) açıklıyor yok de unutun git pushseviyede, hala göz ardı edilebilir.

Bkz. Commit f17d642 (19 Nis 2017), Ævar Arnfjörð Bjarmason ( avar) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 46bdfa3 tamamlama 2017 26 Apr)

push: --force-with-leasebirden çok uzaktan kumandayla belgeleyin ve test edin

Aynı URL'yi gösteren iki uzaktan kumandanın olduğu ve bir arka planda getirme ve sonrasının git push --force-with-leasegetirmediğimiz güncellenmemiş referansları bozmaması gereken durumlar için belgeleyin ve test edin .

Microsoft'un VSC'si gibi bazı editörler, arka planda otomatik getirme özelliğine sahiptir; bu,--force-with-lease--force-with-lease=<refname> buraya eklenen belgelerde belirtildiği gibi & tarafından sunulan korumaları atlar .

Yani şimdilik belgelergit push şunları içerir:

güvenliği ile ilgili genel not: olarak, yani beklenen bir değeri olmayan bu seçeneği tedariki --force-with-leaseveya --force-with-lease=<refname> herhangi bir şeyle çok kötü etkileşimde örtülü çalışır git fetchuzak üzerine, arka planda örneğin itilmeye git fetch origin cronjob daki depo üzerinde.

Sağladığı koruma --force, çalışmanızın temel alınmadığı sonraki değişikliklerin bozulmamasını sağlamaktır, ancak bazı arka plan süreçleri arka planda referansları güncelliyorsa bu önemsiz bir şekilde yenilir. Görmeniz beklenen ve patlamaya hazır olduğunuz referanslar için bir buluşsal yöntem olarak kullanabileceğimiz uzaktan izleme bilgisi dışında hiçbir şeyimiz yok.

Editörünüz veya başka bir sistem sizin git fetchiçin arka planda çalışıyorsa , bunu hafifletmenin bir yolu başka bir uzaktan kumanda kurmaktır:

git remote add origin-push $(git config remote.origin.url)
git fetch origin-push

Artık arkaplan işlemi çalıştığında git fetch originreferanslar origin-pushgüncellenmeyecek ve bu nedenle şu gibi komutlar:

git push --force-with-lease origin-push

Manuel olarak çalıştırmadığınız sürece başarısız olur git fetch origin-push.
Bu yöntem elbette çalışan bir şey tarafından tamamen yenilir git fetch --all, bu durumda ya devre dışı bırakmanız ya da aşağıdaki gibi daha sıkıcı bir şey yapmanız gerekir:

git fetch              # update 'master' from remote
git tag base master    # mark our base point
git rebase -i master   # rewrite some commits
git push --force-with-lease=master:base master:master

Örneğin base, gördüğünüz ve üzerine yazmak istediğiniz yukarı akış kodunun sürümleri için bir etiket oluşturun , ardından geçmişi yeniden yazın ve son olarak , yerel mastersürümünüzün arka fon.baseremotes/origin/master


30

Çözümüm, bir sarmalayıcı komut dosyası oluşturmak ve bir takma ad kullanmaktı, böylece onu her zaman gerçek yerine kullanırım git.

Ne zaman denesem git push -fşunları görüyorum:

⚡ git push -f
use this instead so you don't cause race conditions in the 
repo: git push --force-with-lease

Bu komut dosyasının bazı avantajları şunlardır:

  • Beni alışkanlıkla kullanmam için eğitiyor --force-with-lease, bu yüzden yanlış anladığımda dırdır etmiyorum
  • eğer, herhangi bir nedenle, gerçekten zorlamaya ihtiyacımız varsa, git push --forceişe yarayacaktır.

Nasıl uygulanır:

  1. hariç tüm parametrelerden git'e geçecek özel bir komut dosyası oluşturun -f
  2. bu komut dosyasını diğer adla adlandırın, biz de onu kullanmak yerine git

Bu talimatlar, bash çalıştıran Linux veya Mac'i varsayar. Bunu zsh veya Windows ile denemedim, ancak orada da çalışacağını varsayıyorum.

~/.bash_profile:

alias git=~/.git_wrapper.sh

~./git_wrapper.sh:

#!/bin/bash
for arg in "$@"; do
    if [ "$arg" = "push" ]; then
        ispush=1
    elif [ "$ispush" = 1 -a "$arg" = '-f' ]; then
        echo "use this instead so you don't cause race conflicts in the repo: git push --force-with-lease"
        exit 1
    fi
done

git "$@"

Bu değişikliklerle, terminalinizi yeniden başlatın ve gitzorlamaya çalıştığınızda şimdi üzülmelisiniz.


18
Bu uygun görünüyor. +1. Belki "hey salak" yerine "hey, nazik ama basit ruh" ya da bunun gibi bir şey koyabilirsiniz;)
VonC

5

OMYZSH kullanan kişiler için basitçe kullanabilirsiniz ggfl.


3

Kullanmamam gerektiğini hatırlatmak istiyorum -f , ancak bu -fanlama geldiğine inanarak kandırılmak istemiyorum --force-with-lease. Yani bu benim alacağım:

git() {
  if [[ $@ == 'push -f'* ]]; then
    echo Hey stupid, use --force-with-lease instead
  else
    command git "$@"
  fi
}

Blogunuza ekleyin .bash_profile, .bashrcya da.zshrc .


1

Yerine değiştiren gitve --force-with-leaseyerine kullanan bir bash işlevi oluşturabilirsiniz .--force

# replaces `git push --force` with `git push --force-with-lease`
git() {
  if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then
    command git push --force-with-lease
  else
    command git "$@"
  fi
}

veya tek satırda:

git() { if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then command git push --force-with-lease; else command git "$@"; fi; }

~/.bashrcVeya ekleyin ~/.zshrc.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.