Git में कमिट करने के बाद स्वचालित रूप से पुश कैसे करें?


84

मैं स्थानीय रेपो के लिए प्रत्येक कमिट के बाद किसी दूरस्थ रेपो (स्वचालित रूप से अपना पासफ़्रेज़ प्रदान करने सहित) को स्वचालित रूप से पुश करने के लिए कैसे सेट करूँ?


1
आप किस प्रोटोकॉल पर जोर दे रहे हैं? यदि यह पासवर्ड के लिए संकेत दे रहा है, तो मुझे लगता है कि यह SSH या HTTP है।
मार्क लोंगेयर

1
इसके अलावा, यह हमेशा कम से कम उल्लेख करने के लिए कि आप कौन से ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं, git सवालों के साथ मददगार है।
मार्क लोंगेयर

1
मैं इस तरह के एक सेट की बुद्धि पर सवाल उठाता हूं। यह आपके बदलावों को कमिट के एक अलग सेट में पुनर्गठित करने की किसी भी क्षमता को हटा देता है (विशेष रूप से पुनर्जागरण)। मैं एक सेट अप के लिए बहुत सारी गलतियाँ करता हूँ जैसे कि मेरे लिए उपयोगी होना।
jpmc26

जवाबों:


139

सबसे पहले, सुनिश्चित करें कि आप अपना पासवर्ड प्रदान किए बिना मैन्युअल रूप से धक्का दे सकते हैं। यदि आप HTTP या HTTPS पर जोर दे रहे हैं, तो यह लॉगिन विवरण के साथ फ़ाइल बनाने.netrc या रिमोट के लिए URL में अपना उपयोगकर्ता नाम और पासवर्ड जोड़ने का मामला होगा । यदि आप SSH का उपयोग कर रहे हैं, तो आप या तो एक कीपर बना सकते हैं जहाँ निजी कुंजी का पासवर्ड नहीं है, या अपनी निजी कुंजी को कैश करने के ssh-agentलिए उपयोग करें

फिर आपको एक निष्पादन योग्य ( chmod +x) फ़ाइल बनानी चाहिए .git/hooks/post-commitजिसमें निम्नलिखित शामिल हैं:

#!/bin/sh
git push origin master

... उस लाइन को कस्टमाइज़ करना यदि आप किसी अन्य माध्यम से रिमोट को पुश करना चाहते हैं origin, या इसके अलावा किसी शाखा को पुश करना चाहते हैं master। सुनिश्चित करें कि आप उस फ़ाइल को निष्पादन योग्य बनाते हैं।


3
Ssh-agent मेरे पासफ़्रेज़ को याद नहीं रख सका, इसलिए उसे खाली करना पड़ा। आशा है कि मेरी पत्नी मेरे खाते को हैक नहीं करेगी :)
ulu

अनुकूलन की बात करते हुए, अगर मैं इस तरह से सभी शाखाओं को नहीं बल्कि कुछ को आगे बढ़ाना चाहता हूं तो क्या होगा? उदाहरण के लिए, मैं केवल उन शाखाओं को ऑटो-पुश करना चाहता हूं जिनके पास .git/configउपसर्ग के साथ संगत रिमोट शाखा है feature/xy/
एक्यूमेनस

5
git push --all origin
Yada

4
chmod + x .it / हुक / पोस्ट-कमिटेड
UnchartedWorks

33

यदि आप मास्टर शाखा से अधिक का उपयोग करना शुरू करते हैं, तो आप वर्तमान शाखा को स्वचालित रूप से धक्का देना चाह सकते हैं। मेरा हुक ( .git/hooks/post-commit) इस तरह दिखता है:

#!/usr/bin/env bash

branch_name=$(git symbolic-ref --short HEAD)
retcode=$?
non_push_suffix="_local"

# Only push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
    #Only push if branch_name does not end with the non-push suffix
    if [[ $branch_name != *$non_push_suffix ]] ; then
        echo
        echo "**** Pushing current branch $branch_name to origin [i4h post-commit hook]"
        echo
        git push origin $branch_name;
    fi
fi

यह वर्तमान शाखा को धक्का देता है, अगर यह शाखा के नाम को प्रतीकात्मक प्रतीकात्मक-रेफरी के साथ निर्धारित कर सकता है।

" गिट में वर्तमान शाखा का नाम कैसे प्राप्त करें? " वर्तमान शाखा का नाम प्राप्त करने के लिए इस और अन्य तरीकों से संबंधित है।

टास्क शाखाओं में काम करने के दौरान हर शाखा के लिए एक स्वचालित धक्का परेशान कर सकता है जहां आप कुछ सॉसेज होने की उम्मीद करते हैं (आप पुश करने के बाद आसानी से रीबेस नहीं कर पाएंगे)। तो हुक उन शाखाओं को धक्का नहीं देगा जो एक परिभाषित प्रत्यय के साथ समाप्त होते हैं (उदाहरण में "_local")।


पहली पंक्ति के लिए, मुझे #!/bin/shइसे काम करने के लिए उपयोग करना था । अन्यथा यह कहता रहा error: cannot run .git/hooks/post-commit: No such file or directory:। धन्यवाद, मुझे आपका समाधान सबसे अच्छा लगा।
इलोहि

टिप्पणी के लिए धन्यवाद, @oyalhi, मैंने जवाब में शेबंग लाइन को अपडेट किया। यह अब बेहतर पोर्ट करना चाहिए!
i4h

नमस्ते, मुझे यह त्रुटि मिलती है: .it / हुक / पोस्ट-कमिट: लाइन 3: अप्रत्याशित EOF, जो `` '' की खोज करते हुए है। .it / हुक / पोस्ट-कमिट: लाइन 17: वाक्यविन्यास त्रुटि: फ़ाइल का अप्रत्याशित अंत
wwwwwww.wun

अरे, वास्तव में एक खो बैक्टिक था। मैंने जवाब अपडेट किया, कृपया पुनः प्रयास करें
i4h

9

"Git push" सामग्री के साथ .it / हुक निर्देशिका में "पोस्ट-कमिट" नाम की एक फ़ाइल बनाएँ, हालाँकि यदि आप स्वचालित रूप से पासवर्ड प्रदान करना चाहते हैं, तो संशोधन की आवश्यकता होगी।


अगर मैं कर सकता था, तो मैंने मार्क लोंगेयर के उत्तर को बढ़ा दिया
कॉलिन आर

1
रुको क्या? कॉलिन आर अब शीर्ष 2% में है :)
पोस्ट सेल्फ

3

यह गिट-ऑटोपुश स्क्रिप्ट आपको "बाद में स्वचालित धक्का कैसे कॉन्फ़िगर करें? "
लेकिन पासफ़्रेज़ के लिए, आपको एक चलाने कीssh-agent आवश्यकता है


वहाँ के लिए कोई जरूरत नहीं है ssh-agent, बस एक और पदबंध-कम उपयोग git-only ssh-कुंजी: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonlyecho $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config। पर DESTINATIONकॉन्फ़िगर git-shellमें दिखाया गया है superuser.com/a/444899/72223 से pubkey का उपयोग कर ~/.ssh/id_pushonly.pub। जरूरत git-LL कुछ इस तरह है git@pushonly:path/to/repo.git। डिबग करने के लिए: ssh git@pushonly COMMANDचलाना चाहिए git-shell -c COMMANDपर DESTINATION। के लिए COMMANDदेखman git-shell
टीनो

@Tino धन्यवाद। आप डिजिटल हस्ताक्षर योजना का उपयोग क्यों कर रहे हैं -t ed25519? मैं आम तौर पर उपयोग करता हूं -t rsa, हालांकि हाल ही में मुझे ( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ) को जोड़ना -m PEMहै । ssh-keygen
VonC

@ मैं समझता हूं कि आरएसए धीमा है, कम सुरक्षित है (यदि इसकी लंबाई 2048 बिट्स से कम है: bagja.net/blog/upgrad-ssh-key-to-ed25519.html ), लेकिन मैं पुराने ओपिनियन सर्वरों के साथ काम करता हूं, जो हो सकता है सही ढंग से एक ed255519 हस्ताक्षर की व्याख्या नहीं।
VonC

मैं मुख्य रूप से उपयोग करता हूं ed25519क्योंकि यह छोटी और आसान लाइनें देता है ~/.ssh/authorized_keys। यह भी बहुत दिलचस्प है कि डीजेबी एड 255519 के बारे में क्या लिखता है : साइड चैनल (स्पेक्टर), कम सीपीयू, आदि बीटीडब्ल्यू के खिलाफ सुरक्षित करें, जब पुराने sshdएस के साथ काम करते हैं , तो मैं आमतौर पर उनके लिए एक विशेष कुंजी बनाता हूं और फिर इसे कॉन्फ़िगर करता हूं ~/.ssh/config
टीनो

0

लिनक्स और विंडोज (git bash) का उपयोग करने वाले लोगों के लिए ssh पर पासफ़्रेज़ प्रदान किए बिना धकेलने / खींचने के लिए सरल निर्देश है

अपने ग्राहक पर:

  1. देखें कि क्या आपके पास ssh कीज़ जेनरेट हुई हैं:

    $ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
    /c/Users/Cermo/.ssh/id_rsa.pub  <-- I have RSA key
    ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
    
  2. यदि आपके पास कोई कुंजी नहीं है (दो "एलएस: एक्सेस नहीं कर सकते ..." लाइनें) एक नया उत्पन्न करती हैं। यदि आपके पास कोई कुंजी है तो इस चरण को छोड़ दें।

    $ ssh-keygen.exe
    Generating public/private rsa key pair.
    Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase): <-- press Enter
    Enter same passphrase again: <-- press Enter
    
  3. अपनी कुंजी को दूरस्थ सर्वर पर कॉपी करें जिससे आप git का उपयोग करके खींचना या धक्का देना चाहते हैं:

    $ ssh-copy-id user_name@server_name
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to 
    filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you 
    are prompted now it is to install the new keys
    user_name@server_name's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'user_name@server_name'"
    and check to make sure that only the key(s) you wanted were added.
    

नोट: आपको इस ऑपरेशन के दौरान पासवर्ड देना होगा। उसके बाद आपका पुल / पुश ऑपरेशन पासवर्ड का अनुरोध नहीं करेगा।

नोट 2: आपको इस प्रक्रिया का उपयोग करने से पहले कम से कम एक बार user_name का उपयोग करके सर्वर पर लॉग इन करना होगा (होम डायरेक्टरी जिसमें ssh कीज कॉपी की गई हैं, पहले लॉगिन के दौरान बनाई गई हैं)


0

यहाँ pushदूरस्थ स्क्रिप्ट के लिए स्वचालित रूप से गिट के लिए बैश स्क्रिप्ट है

  1. स्वचालित रूप से ssh- एजेंट की जाँच करें
  2. उम्मीद की स्क्रिप्ट का उपयोग करके स्वचालित रूप से पासफ़्रेज़ भेजें
  3. उपयोग बस है: $ cd /path/to/your/repositoryतब$ push

उदाहरण के लिए इस स्क्रिप्ट को एक फ़ाइल में रखें $HOME/.ssh/push

#!/bin/bash

# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null

# Check if git config is configured
if [ ! $(git config user.name) ]
then 
    git config --global user.name <user_name>
    git config --global user.email <user_email>
fi

# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then 
    apt-get update > /dev/null
    apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi

# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null

# Clean and push repo
REMOTE=$(git remote get-url origin)
URL=git@github.com:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url origin $URL
git add . && git commit -m "test automatically push to a remote repo"
git status && git push origin $(git rev-parse --abbrev-ref HEAD) --force

इसे /binडायरेक्ट्री से लिंक करें ताकि इसे केवल $ pushकमांड द्वारा बुलाया जा सके

$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push

0

यदि आप कर्कश का उपयोग कर रहे हैं, तो यह आपकी post-commitहुक फ़ाइल को डिफ़ॉल्ट रूप से अधिलेखित कर देगा ।

हम इस आदेश का उपयोग पैकेज में कर रहे हैं। ऑटो-रिबास और किसी भी काम को करने के लिए पुश करें। (पहला रन yarn add --dev git-branch-is।)

  "husky": {
    "hooks": {
     "post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
    }
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.