पुश -फोर्स-साथ-लीज़ डिफ़ॉल्ट रूप से


130

मैं बस के बारे में सीखा है git push --force-with-lease। यह बहुत बढ़िया है। लेकिन, निश्चित रूप से, मैं अक्सर उस बल का उपयोग नहीं करता हूं, और इसलिए मैं चिंतित हूं कि अगली बार जब मुझे इसकी आवश्यकता हो तो मैं इस निफ्टी फीचर के बारे में भूल सकता हूं।

क्या जीआईटी को कॉन्फ़िगर करने का एक तरीका है तो git push -fस्वचालित रूप से उपयोग करेगा --force-with-leaseजब तक कि मैं जानबूझकर इसके साथ ओवरराइड नहीं करता --no-force-with-lease?

(मैं कभी भी पट्टे के बिना बल का उपयोग करने की इच्छा नहीं कर सकता!)

जवाबों:


141

AFAIK कोई विन्यास उपलब्ध नहीं है जो यह बताने के लिए हमेशा उपयोग force-with-leaseकरने के लिए git बताए force। यह एक सुविधा अनुरोध के लिए एक अच्छा उदाहरण लगता है; यदि आपको गिट कोड आधार में गोता लगाने की कोई समस्या नहीं है तो आप इसे स्वयं लागू कर सकते हैं और समीक्षा के लिए प्रस्तुत कर सकते हैं।

EDIT जैसा कि यह खड़ा है, यह अप्रैल 2019 में अभी भी सही है।

तब तक जो एकमात्र विकल्प मैं देख रहा हूं, जैसा कि अक्सर होता है, aliasइस उद्देश्य को पूरा करने के लिए।

एक उपनाम बनाएँ

एक उपनाम का उपयोग करने के लिए git config --global alias.<alias-name> <command>, हमारे मामले में मैं इसके समान कुछ सुझाऊंगा।

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

यह आपकी वैश्विक .gitconfigफ़ाइल में एक प्रविष्टि बनाएगा (जिसे आप आमतौर पर अपने होम डायरेक्टरी में पा सकते हैं )। इसके बाद आप बस बलपूर्वक पट्टे केgit pushf लिए उपयोग कर सकते हैं ।

अपने हाथ गंदे कर लो

यदि आप स्वयं इस सुविधा को लागू करना चाहते हैं, लेकिन सुनिश्चित नहीं हैं कि कहां से शुरू करें, तो आपको सबसे पहले गिट रिपॉजिटरी में प्रलेखन निर्देशिका पर एक नज़र डालनी चाहिए । यहाँ आप पा सकते हैं कोडिंग दिशा - निर्देश और जानकारी पैच कैसे सबमिट करें

आप आधिकारिक समुदाय पृष्ठ पर इन सभी लिंक और अधिक पा सकते हैं ।


25
इस पर एक नोट एक विशेषता नहीं है: मानक आदेशों को फिर से लिखने ("पुश - प्रवर्तन") के खिलाफ आम तर्क यह है कि आप उनके लिए अभ्यस्त हो जाते हैं, उनके मूल को भूल जाते हैं, और एक दिन गलती से उन्हें एक नई प्रणाली पर उस तरह से उपयोग करते हैं। अपने .bashrc में अलियासिंग rmकरने की तरह rm -i; आप किसी दिन सर्वर पर एक महत्वपूर्ण फ़ाइल भूल जाएंगे और हटा देंगे। अपने स्वयं के उपनाम के साथ जाने से यह समस्या नहीं होती है :)
hraban

2
व्यक्तिगत उपाख्यान / सावधानी के शब्द: मैंने इसे अलियासिंग करने की कोशिश की, pushfलेकिन हमेशा यह जांचता रहा कि मैं ऐसा नहीं कर रहा था push -f, क्योंकि यह उर्फ ​​के समान दिख रहा था । कुछ टीम के सदस्य किसी push -fभी तरह से सोच रहे थे कि यह उर्फ ​​इसके लिए केवल एक छोटा रास्ता था। अंत में, हमने pushflइसके बजाय सुरक्षित रूप को बदल दिया और इसके बारे में चिंता करना बंद कर दिया।
केल्विन

31

मुझे चिंता है कि अगली बार जब मुझे इसकी आवश्यकता होगी तो मैं इस निफ्टी फीचर के बारे में भूल सकता हूं।

Git 2.13 (Q2 2017) बताता है कि इस पुश ऑप्शन के खिलाफ "सुरक्षा" क्यों नहीं है, क्योंकि अगर आप इसे स्तर पर नहीं भूलते हैं git push, तो भी इसे अनदेखा किया जा सकता है।

देखें f17d642 प्रतिबद्ध (19 अप्रैल 2017) से Ævar Arnfjörð Bjarmason ( avar)
( जूनियो सी gitsterहमानो द्वारा विलय - - में ४६bdfa3 , २६ अप्रैल २०१io )

push: --force-with-leaseकई रिमोट के साथ दस्तावेज़ और परीक्षण

उन मामलों के लिए दस्तावेज़ और परीक्षण जहां एक ही URL को इंगित करने वाले दो रीमोट हैं, और एक पृष्ठभूमि लाने और बाद में git push --force-with-leaseअन-अपडेट किए गए संदर्भों को बंद नहीं करना चाहिए जिन्हें हमने नहीं लिया है।

Microsoft के VSC जैसे कुछ संपादकों की पृष्ठभूमि में ऑटो-फ़ेच करने की सुविधा है, यह उनके द्वारा प्रस्तुत किए--force-with-lease--force-with-lease=<refname> गए दस्तावेज़ों को ध्यान में रखते हुए और उनके द्वारा प्रस्तावित सुरक्षा को बायपास करता है।

तो अब के लिए प्रलेखन मेंgit push शामिल हैं:

सुरक्षा पर सामान्य ध्यान दें: इस विकल्प की आपूर्ति एक अपेक्षित मूल्य के बिना, यानी के रूप में --force-with-leaseया --force-with-lease=<refname> बहुत बुरी तरह से किसी भी चीज के साथ इंटरैक्ट करता है, जो कि git fetchरिमोट पर पृष्ठभूमि में धकेलने के लिए रिमोट पर चलता है , जैसे git fetch origin क्रोनजॉब में आपकी रिपॉजिटरी पर।

यह जो सुरक्षा प्रदान करता है वह यह सुनिश्चित कर रहा --forceहै कि बाद में आपके काम पर आधारित परिवर्तन क्लोबर्ड नहीं थे, लेकिन यदि पृष्ठभूमि की कुछ प्रक्रिया बैकग्राउंड में refs को अपडेट कर रही है तो यह बहुत ही पराजित है। हमारे पास दूरस्थ ट्रैकिंग जानकारी के अलावा ऐसा कुछ भी नहीं है जिसे आप जिस रेफरी के पास जाने के लिए उम्मीद कर रहे हैं और जिसे क्लोब करने के लिए तैयार हैं।

यदि आपका संपादक या कोई अन्य सिस्टम git fetchआपके लिए पृष्ठभूमि में चल रहा है तो इसे कम करने का एक तरीका है कि आप दूसरे रिमोट को सेट करें:

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

अब जब पृष्ठभूमि प्रक्रिया चलती है git fetch originतो संदर्भ origin-pushअद्यतन नहीं किए जाएंगे, और इस तरह जैसे आदेश होते हैं:

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

जब तक आप मैन्युअल रूप से नहीं चलेंगे तब तक असफल रहेंगे git fetch origin-push
यह विधि निश्चित रूप से किसी ऐसी चीज से पूरी तरह से पराजित होती है, जो चलती है git fetch --all, उस स्थिति में आपको या तो इसे निष्क्रिय करना होगा या कुछ और करना होगा जैसे:

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

यानी baseआपके द्वारा देखे गए अपस्ट्रीम कोड के संस्करणों के लिए एक टैग बनाएं और फिर उसे अधिलेखित करने के लिए तैयार हैं, फिर इतिहास को फिर से लिखें, और अंत में धक्का परिवर्तन को बल दें masterयदि दूरस्थ संस्करण अभी भी है base, भले ही आपके स्थानीय remotes/origin/masterको अपडेट किया गया हो। पृष्ठभूमि।


30

मेरा समाधान एक आवरण स्क्रिप्ट बनाना था, और एक उपनाम का उपयोग करना ताकि मैं हमेशा वास्तविक के स्थान पर इसका उपयोग करूं git

जब भी मैं कोशिश करता git push -fहूं, मैं निम्नलिखित देखता हूं:

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

इस स्क्रिप्ट के कुछ फायदे हैं:

  • यह मुझे आदतन उपयोग करने के लिए प्रशिक्षित करता है --force-with-lease, इसलिए जब मैं गलत हो जाता हूं, तो मैं परेशान नहीं होता
  • यदि, किसी कारण से, हमें वास्तव में जोर लगाने की आवश्यकता है, git push --forceतो काम करेगा।

इसे कैसे लागू करें:

  1. एक कस्टम स्क्रिप्ट बनाएं, जो किसी भी पैरामेट्स के माध्यम से पास करने के लिए पास करेगा -f
  2. उस स्क्रिप्ट का नाम है, इसलिए हम इसके बजाय इसका उपयोग करते हैं git

ये निर्देश लिनक्स या मैक को चलाने वाले बैश मानते हैं। मैंने इसे zsh या Windows के साथ आज़माया नहीं है, लेकिन मुझे लगता है कि यह वहाँ भी काम करेगा।

~/.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 "$@"

उन परिवर्तनों के साथ, अपने टर्मिनल को फिर से शुरू करें और gitजब आपको धक्का देने की कोशिश करनी हो, तो उसे ऊपर उठना चाहिए।


17
जो सुविधाजनक लगता है। +1। ); शायद की जगह "हे मूर्ख" द्वारा "अरे, तुम कोमल लेकिन सरल आत्मा" या ऐसा somehing
VonC

5

OMYZSH का उपयोग करने वाले लोगों के लिए आप बस उपयोग कर सकते हैं ggfl


3

मैं याद दिलाना चाहता हूं कि मुझे इसका उपयोग नहीं करना चाहिए -f, लेकिन मैं -fइसका मतलब यह नहीं मानना ​​चाहता हूं कि मैं मूर्ख नहीं बनना चाहता --force-with-lease। तो यह मेरा लेना है:

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

अपने में जोड़ें .bash_profile, .bashrcया .zshrc


1

आप एक बश फ़ंक्शन बना सकते हैं जो इसके स्थान पर प्रतिस्थापित gitऔर उपयोग कर --force-with-leaseसकता है--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
}

या, एक पंक्ति में:

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

बस इसे अपने ~/.bashrcया में जोड़ें ~/.zshrc

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.