গিট কমিট করার পরে কীভাবে স্বয়ংক্রিয়ভাবে চাপ দেবেন?


86

স্থানীয় রেপোতে প্রতিশ্রুতি দেওয়ার পরে কীভাবে আমি গিটটি স্বয়ংক্রিয়ভাবে একটি দূরবর্তী রেপোতে (স্বয়ংক্রিয়ভাবে আমার পাসফ্রেজ সরবরাহ করে) চাপতে পারি?


4
আপনি কি প্রোটোকল উপর চাপ দিচ্ছেন? যদি এটি পাসওয়ার্ডের জন্য অনুরোধ জানায় তবে আমি ধরে নিই যে এটি হয় এসএসএইচ বা এইচটিটিপি।
লংগায়ারকে

4
এছাড়াও, কমপক্ষে আপনি কোন অপারেটিং সিস্টেমটি ব্যবহার করছেন তা উল্লেখ করার জন্য গিট প্রশ্নগুলির সাথে সর্বদা সহায়ক।
লংগায়ার

4
আমি যেমন একটি সেট আপ এর জ্ঞান প্রশ্ন। এটি আপনার পরিবর্তনগুলিকে আলাদা আলাদা কমিটের (পুনরায় প্রত্যাখ্যানকারী, বিশেষত) সেটগুলিতে পুনর্গঠনের যে কোনও ক্ষমতা সরিয়ে দেয়। আমার পক্ষে দরকারী হয়ে ওঠার জন্য এই জাতীয় একটি সেট আপ করার জন্য আমি অনেকগুলি ভুল করি।
jpmc26

উত্তর:


141

প্রথমে নিশ্চিত হয়ে নিন যে আপনি নিজের পাসওয়ার্ড না দিয়ে ম্যানুয়ালি চাপ দিতে পারেন। আপনি যদি এইচটিটিপি বা এইচটিটিপিএসের উপর চাপ দিচ্ছেন, তা হয় লগইন বিশদ সহ কোনও .netrcফাইল তৈরি করা বা দূরবর্তীটির URL এ আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড যুক্ত করার ক্ষেত্রে এটি ঘটবে । আপনি যদি এসএসএইচ ব্যবহার করে থাকেন তবে আপনি হয় একটি কী-পেয়ার তৈরি করতে পারেন যেখানে ব্যক্তিগত কীতে কোনও পাসওয়ার্ড নেই, বা আপনার ব্যক্তিগত কীটি ক্যাশে করতে ব্যবহার ssh-agentকরতে পারেন

তারপরে আপনার একটি এক্সিকিউটেবল ( chmod +x) ফাইল তৈরি করতে হবে যাতে .git/hooks/post-commitনিম্নলিখিতটি থাকে:

#!/bin/sh
git push origin master

... আপনি যদি অন্য কোনও দূরবর্তী স্থানে ধাক্কা দিতে চান origin, বা অন্য কোনও শাখা টিপতে চান তবে এই লাইনটি কাস্টমাইজ করুন master। আপনি যে ফাইলটি কার্যকর হতে চলেছেন তা নিশ্চিত করুন।


4
Ssh- এজেন্ট আমার পাসফ্রেজ মনে রাখতে পারে না তাই এটি খালি করতে হয়েছিল। আশা করি আমার স্ত্রী আমার অ্যাকাউন্ট :) হ্যাক করা হবে না
Ulu

কাস্টমাইজেশনের কথা বলছি, আমি যদি কিছু এইভাবে সমস্ত শাখাকে না ধাক্কা দিতে চাই তবে কী হবে? উদাহরণস্বরূপ, আমি কেবলমাত্র সেই শাখাগুলিকে অটল-চাপ দিতে চাই যার সাথে সংশ্লিষ্ট প্রত্যন্ত শাখাটি .git/configউপসর্গের সাথে উল্লিখিত হয়েছে feature/xy/
একিউম্যানাস

4
গিট পুশ
ইয়াদ

4
chmod + x .git / hooks / অঙ্গীকার
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। আপনাকে ধন্যবাদ, আমি আপনার সমাধান সেরা পছন্দ।
ওয়ালহি

@ য়ৌলি, মন্তব্যের জন্য আপনাকে ধন্যবাদ, আমি উত্তরে শেবাং লাইনটি আপডেট করেছি। এটি এখন আরও ভাল পোর্ট করা উচিত!
i4h

হ্যালো আমি এই ত্রুটিটি পেয়েছি: .গিট / হুকস / পোস্ট কমিট: লাইন 3: matching। '.গিট / হুকস / পোস্ট কমিটের সাথে মিলানোর সময় অপ্রত্যাশিত ইওএফ: লাইন 17: সিনট্যাক্স ত্রুটি: ফাইলের অপ্রত্যাশিত শেষ
টোবিয়াস

আরে, সত্যিই এখানে একটি হারিয়ে যাওয়া ব্যাকটিক ছিল। আমি উত্তরটি আপডেট করেছি, দয়া করে আবার চেষ্টা করুন
i4h

9

"গিট পুশ" বিষয়বস্তু দিয়ে .git / হুক ডিরেক্টরিতে "পোস্ট কমিট" নামে একটি ফাইল তৈরি করুন, যদিও আপনি যদি স্বয়ংক্রিয়ভাবে একটি পাসওয়ার্ড সরবরাহ করতে চান, তবে পরিবর্তনের প্রয়োজন হবে।


আমি পারলে মার্ক লংগায়ারের উত্তরটি অগ্রাহ্য করতাম।
কলিন আর

4
কিসের অপেক্ষা? কলিন আর এখন শীর্ষে 2% :)
পোস্ট করুন

3

এই গিট-অটোপশ স্ক্রিপ্টটি আপনাকে " স্বয়ংক্রিয়ভাবে পুশ করার পদ্ধতি কীভাবে কনফিগার করা যায়? " - তে প্রস্তাবিত অনুরূপ পোস্ট-কমিট হুক সেটআপ করতে দেয় ।
তবে পাসফ্রেজের জন্য আপনার একটি চালানোssh-agent দরকার ।


সেখানে প্রয়োজন নেই ssh-agent, শুধু আরেকটি পাসফ্রেজ-কম ব্যবহার git-only ssh-key: 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ইউআরএল এর মতো কিছু git@pushonly:path/to/repo.git। ডিবাগ করতে: ssh git@pushonly COMMANDচালাতে git-shell -c COMMANDহবে DESTINATION। জন্য COMMANDদেখতেman git-shell
টিনো

@ টিনো আপনাকে ধন্যবাদ আপনি ডিজিটাল সিগনেচার স্কিম ব্যবহার করছেন কেন -t ed25519? আমি সাধারণত ব্যবহার করি -t rsaযদিও সাম্প্রতিককালে আমাকে যুক্ত -m PEMকরতে হবে ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 )।
ভোনসি 24'19

@ টিনো আমি বুঝতে পেরেছি যে আরএসএ ধীর, কম সুরক্ষিত (যদি এর দৈর্ঘ্য 2048 বিটের চেয়ে কম হয়: ব্যাগজা.नेट / ব্লগ / আপগ্রেড-ssh-key-to-ed25519.html ) তবে আমি পুরানো ওপেনশ সার্ভারের সাথে কাজ করব যা সম্ভবত একটি ed255519 স্বাক্ষর সঠিকভাবে ব্যাখ্যা করবেন না।
ভোনসি

আমি প্রাথমিকভাবে ব্যবহার করি ed25519কারণ এটি সংক্ষিপ্ত এবং সহজ লাইন দেয় ~/.ssh/authorized_keys। এছাড়াও এটি খুব মজার বিষয় যে ডিজেবি এডি 255519 সম্পর্কে কী লিখেছে : পার্শ্ব চ্যানেলগুলি ( স্পেকটার ), কম সিপিইউ ইত্যাদির বিরুদ্ধে সুরক্ষিত বিটিডাব্লু , পুরানোগুলির সাথে লেনদেন করার সময় sshdআমি সাধারণত তাদের জন্য একটি বিশেষ কী তৈরি করি এবং তারপরে এটিকে কনফিগার করি ~/.ssh/config
টিনো

0

লিনাক্স এবং উইন্ডোজ (গিট ব্যাশ) ব্যবহারকারীদের জন্য এসএসএসের উপরে পাসফ্রেজ সরবরাহ না করে ধাক্কা / টান দেওয়ার সহজ নির্দেশনা এখানে দেওয়া হল

আপনার ক্লায়েন্টে:

  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. আপনার যদি কোনও কী না থাকে (দুটি "ls: অ্যাক্সেস করতে পারে না ..." লাইনগুলি) একটি নতুন তৈরি করে। যদি আপনার কোনও কী থাকে তবে এই পদক্ষেপটি এড়িয়ে যান।

    $ 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. রিমোট সার্ভারে আপনার কী অনুলিপি করুন যা থেকে আপনি গিট ব্যবহার করে টানতে বা ধাক্কা দিতে চান:

    $ 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: এই পদ্ধতিটি ব্যবহার করার আগে আপনাকে ব্যবহারকারীর নাম ব্যবহার করে সার্ভারে লগইন করতে হবে (হোম ডিরেক্টরি যেখানে প্রথমে লগইনের সময় 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"`
    }
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.