একাধিক দূরবর্তী অবস্থান থেকে টানুন / চাপুন


743

সংক্ষিপ্ত: গিট রেপোতে কি কোনও উপায় আছে যা দূরবর্তী রেপোগুলির তালিকা থেকে এককভাবে "একক" উত্স "না দিয়ে টানতে এবং টানতে পারে?

দীর্ঘ: আমার প্রায়শই এমন পরিস্থিতি থাকে যখন আমি বিভিন্ন সংযোগের সাথে একাধিক কম্পিউটারে একটি অ্যাপ্লিকেশন বিকাশ করি - ট্রানজিট চলাকালীন একটি ল্যাপটপ বলি, আমি একটি নির্দিষ্ট স্থানে থাকাকালীন একটি কম্পিউটার "এ" এবং অন্য একটি কম্পিউটার "বি" বলি অন্যদিকে। এছাড়াও, ল্যাপটপে কেবলমাত্র "এ" বা "বি", এবং কখনও কখনও উভয়ের সাথে সংযোগ থাকতে পারে।

আমি যা চাই তা হ'ল গিটকে সর্বদা "কম্পিউটারে" টানতে এবং "বর্তমানে" কম্পিউটারে সংযুক্ত হতে পারে এমন সমস্ত কম্পিউটারে "ধাক্কা" দেওয়ার জন্য, সুতরাং একটি মেশিন থেকে অন্য মেশিনে ঝাঁপিয়ে পড়া এবং নির্বিঘ্নে কাজ চালিয়ে যাওয়া আরও সহজ।


39
2016 এর হিসাবে নতুন দর্শকদের জন্য নোট: এই, প্রথম শ্রেণীর দ্বারা অনুমোদিত করতে বর্তমানে সঠিক উপায় gitবৈশিষ্ট্য, অন্তর্ভুক্ত করা হয়েছে malvineous এর নিচে উত্তর । গৃহীত উত্তরটি ভুল।
এলিওটিটিসিবল

@ জোর্জেলা: আপনি কি এই বিষয়ে গৃহীত উত্তর আপডেট করতে পারবেন, এটি বর্তমানে যেভাবে চলছে তা বিভ্রান্তিমূলক।
ntninja

উত্তর:


503

আপনি git remoteকমান্ডটি সহ একাধিক দূরবর্তী সংগ্রহস্থল কনফিগার করতে পারেন :

git remote add alt alt-machine:/path/to/repo

সমস্ত কনফিগার করা দূরবর্তী থেকে আনতে এবং ট্র্যাকিং শাখাগুলি আপডেট করতে, তবে এতে মার্জ HEADনা করে:

git remote update

এটি বর্তমানে রিমোটগুলির একটির সাথে সংযুক্ত না থাকলে এটি সময় নিতে পারে বা একটি ত্রুটি ফেলে দেয় এবং পরবর্তীটিতে যেতে পারে। আনয়নকৃত সংগ্রহাগুলি থেকে আপনাকে ম্যানুয়ালি মার্জ করতে হবে বা cherry-pickআপনি কীভাবে পরিবর্তনগুলি সংগ্রহের ব্যবস্থা করতে চান তার উপর নির্ভর করে।

Alt থেকে মাস্টার শাখাটি আনতে এবং এটি আপনার বর্তমান মাথায় টানতে, করুন:

git pull alt master

সুতরাং বাস্তবে git pullএটি প্রায় সংক্ষিপ্তরূপে git pull origin HEAD(আসলে এটি নির্ধারণ করার জন্য এটি কনফিগার ফাইলে দেখায় তবে আপনি ধারণাটি পাবেন)।

আপডেটগুলি ধাক্কা দেওয়ার জন্য, আপনাকে প্রতিটি রেপোটিকে ম্যানুয়ালি করতে হবে।
আমি মনে করি, কেন্দ্রীয়-ভান্ডার ওয়ার্কফ্লোটি মাথায় রেখে ডিজাইন করা হয়েছিল।


সুতরাং আপনি যা বলছেন তা হ'ল "গিট রিমোট অ্যাড foo ssh: //foo.bar/22" একটি শর্টহ্যান্ড ফর্ম তৈরি করে, তবে আমার এখনও তাদের "গিট টান" দিয়ে লুপ করতে হবে, বা "গিট দিয়ে তাদের উপর লুপ করতে হবে" সংশ্লেষ "(এখানে" সিনট্যাক্স কী, "গিট রিমোট আপডেট" এর পরে?) এই সংক্ষিপ্ত নামটি "গিট পুশ" এর জন্যও কাজ করবে না? আমি কি "গিট পুশ ফু" ইত্যাদি (লুপ) পারি না? ধন্যবাদ
জোড়জেলা

8
"গিট টান" মূলত "গিট ফ্যাচ" এর পরে "গিট মার্জ" হয়। "গিট রিমোট আপডেট" আপনাকে কেবল "গিট ফ্যাচ" কল করে। সুতরাং যা বাকি আছে তা হল "গিট একীভূত" বিট করা। আপনি "গিট মার্জ অরিজিন / মাস্টার" বলতে পারেন এবং এটি আপনার বর্তমান হেডের সাথে উত্সের উত্সর সংস্করণটি মার্জ করবে। "গিট টান অরিজিন মাস্টার" একই কাজ করে, যদিও এটি প্রথমে আনতে হবে (এবং যদি আপনি ইতিমধ্যে গিট রিমোট আপডেট করেছেন তবে এর আরও কিছু পাওয়ার দরকার নেই, সুতরাং এটি অনর্থক)। হ্যাঁ, আপনি "গিট পুশ ফু" বলতে পারেন এবং এটি "foo" নামক দূরবর্তী অঞ্চলে সমস্ত মিলে যাওয়া শাখাগুলিকে ঠেলে দেবে।
আরাকনিদ

আইআইইউসি আপনি একটি কার্যকরী ভান্ডারগুলিতে চাপ দিতে পারবেন না (সর্বোপরি আপনি হয়ত বেমানান / অনাকাঙ্ক্ষিত / অযাচিত পরিবর্তনগুলিতে চাপ দিচ্ছেন)। আমাদের অবশ্যই খালি সংগ্রহস্থলগুলিতে প্রবেশ করাতে হবে এবং যখন আমরা টানছি তখন কেবল আপডেটগুলি পাই। সুতরাং সমাধানটির জন্য প্রতিটি মেশিনে একটি কাজ এবং একটি খালি সংগ্রহস্থল প্রয়োজন?
জোয়েটউইডল

2
দৃশ্যত আপনার কাছে কয়েকটি Repos জন্য একটি একক ধাক্কা থাকতে পারে আরো বিস্তারিত জানার জন্য এই উত্তরটি পরীক্ষা stackoverflow.com/questions/14290113/...
manei_cc

797

ম্যানুয়ালি এটি করার আর প্রয়োজন নেই , আধুনিক সংস্করণগুলির সাথে git! দেখুন Malvineous এর সমাধান, কম।

এখানে পুনরুত্পাদন:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

আসল উত্তর:

এই কিছুটি আমি খারাপ পরিণতি ছাড়াই বেশ কিছুক্ষণ ব্যবহার করে আসছি এবং লিনাস টরভাল্ডস গিট মেলিং তালিকায় পরামর্শ দিয়েছি ।

araqnid এর সমাধান কোড আনার জন্য সঠিক অন্যতম মধ্যে আপনার সংগ্রহস্থলের ... কিন্তু যখন তুমি, আমার মত, একাধিক সমতুল্য প্রামাণিক upstreams আছে (আমি আমার আরো সমালোচনামূলক উভয় একটি প্রাইভেট মূল প্রজেক্টের, GitHub, এবং Codaset ক্লোন প্রকল্পের কিছু রাখা), এটা প্রতিদিনের প্রতিটিটিতে পরিবর্তন আনতে ব্যথা হতে পারে।

দীর্ঘ গল্প সংক্ষিপ্ত, git remote addআপনার প্রত্যেকে প্রত্যেকে পৃথকভাবে… এবং তারপরে git config -eএবং একীভূত ‐ রিমোট যুক্ত করুন। ধরে নিচ্ছি আপনার কাছে এই সংগ্রহস্থল রয়েছে config:

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

… এর জন্য একটি মার্জড ‐ রিমোট তৈরি করতে "Paws"এবং এর "Codaset"পরে আমি নিম্নলিখিতগুলি যুক্ত করতে পারি:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

একবার আমি এই কাজটি করে ফেলেছি, যখন আমি git push Origin Master, এটি উভয় দিকে Paws/Masterএবং Codaset/Masterক্রমানুসারে চাপিয়ে দেবে , জীবনকে একটু সহজ করে তুলবে।


104
git config -e.git/configআপনার পছন্দসই সম্পাদকটিতে ফাইলটি খোলে ।
রিচার্ড

3
শুধু ক্ষেত্রে। নিশ্চিত হওয়া যে 2 টি url সহ একটি রিমোট থাকা এখনও 1.7.12.4-এ কাজ করে। ধন্যবাদ।
foobar

26
এটিকে কিছুটা পরিষ্কার
পরিস্কার

1
@ জেমসওয়াম্যাক নীচে @ মালভাইনাসের উত্তর দেখুন। এটি এখন "আরও সঠিক", যেমন gitকমান্ড-লাইন এটিকে স্থানীয়ভাবে সমর্থন করে git remote set-url ... --add
এলিওটিটিসিবল

1
[branch "Master"]সেট এর অধীনে remote = Originএবং git pullউভয় রিমোট ব্যবহার করবে।
বেংট

264

গিট ১.৮ (অক্টোবর ২০১২) থেকে আপনি কমান্ড লাইন থেকে এটি করতে সক্ষম হন:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

তারপরে git pushইউজার 1 @ রেপো 1 তে চাপ দেবে, তারপরে ইউজার 2 @ রেপো 2 তে চাপ দেবে।


19
আমি দৃ strongly়ভাবে এই সমাধানের বিরুদ্ধে পরামর্শ দিচ্ছি। আমরা এটি আমাদের সংস্থায় ব্যবহার করেছি এবং একটি ভাণ্ডারে হুক ব্যর্থ হয়ে গুরুতর সমস্যায় পড়েছি, তবে অন্যটিতে নয়। চেঞ্জসেটগুলি তখন কেবল একটি সংগ্রহস্থলে উপস্থিত ছিল।
মাইকেল শ্মিয়ের

4
@ মাইকেলশ্মিয়ের: সম্ভবত ধাক্কা দেওয়ার সময় আপনি ত্রুটি বার্তাগুলি দেখতে পাচ্ছিলেন, সমস্যাটি সমাধান করুন, তারপরে সবকিছুকে পরিষ্কার অবস্থায় ফিরিয়ে আনতে আবার চাপ দিন?
মালভাইনাস

7
সমস্যাটি হ'ল প্রত্যাখ্যাত ধাক্কা ঠিক করার মধ্যে কমিটগুলি পরিবর্তন করা জড়িত যা ইতিমধ্যে অন্য রেপোতে চাপ দেওয়া হয়েছে। সুতরাং, যদি কেউ ইতিমধ্যে নির্ধারিত সময়ের মধ্যে সেই প্রতিশ্রুতিগুলির উপর ভিত্তি করে কাজ করে থাকে তবে জিনিসগুলি সত্যই খারাপ লাগে, যা আমাদের অফিসে ছিল।
মাইকেল শ্মিয়ের

9
হ্যাঁ, এটি জটিল হতে পারে। তবে আমার কাছে মনে হয় হুকগুলির পুনরায় নকশা করা দরকার। একটি ব্যর্থ ধাক্কা সাধারণত গিটটি ভাঙে না, সুতরাং ব্যর্থতার নতুন বিন্দু প্রবর্তন করা (এটি আপনাকে নিফটির গিট বৈশিষ্ট্যটি ব্যবহার থেকে বিরত করে) সম্ভবত সেরা সমাধান নয়। অবশ্যই আমি আপনার প্রয়োজনীয়তাগুলি কি তা না জেনে এটি বলছি ...
মালভাইনাস

3
না। আমার প্রশ্ন লেখার পর থেকে, আমি অন্যান্য ওয়েব পোস্টিং পড়েছি এবং তারপরে এই জিনিসটি পরীক্ষা করেছি। অন্যান্য পোস্টিং পড়া থেকে আমার সন্দেহ হয় যে কেবল প্রথম লাইনটি ব্যবহার করা হয়েছে। আমি এটি পরীক্ষা করে দেখেছি: প্রকৃতপক্ষে, কেবল প্রথম পংক্তির URL টি দ্বারা পরিদর্শন করা হবে git fetch। (এটি প্রদত্ত, আমি বুঝতে পারি না git remote set-url --addছাড়া উদ্দেশ্য কী হতে পারে --push।)
ইম্জ - ইভান জ্যাকারিয়াশেভ

34

আমি আমার ~ / .bashrc এ এই উপাধি যুক্ত করেছি:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

6
এটা সত্যিই দারুন! আমি একটি গিট ওরফে থাকার শেষ করেছি: git config alias.pushall '!for i in গিট রিমোট; do git push $i; done;'
সিরো সান্তিলি 法轮功 病毒 审查 六四 事件 法轮功

আমি মনে করি একটি নতুন রিমোট তৈরির জন্য আমি উপনামের সমাধানটি পছন্দ করি। আরও দেখুন stackoverflow.com/questions/41372919/...
donquixote

1
ছোট প্রস্তাবিত তাত্ক্ষণিক:alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'
স্কট সি উইলসন

25

আপনি এর সাথে রিমোটগুলি যুক্ত করতে পারেন:

git remote add a urla
git remote add b urlb

তারপরে সমস্ত রেপো আপডেট করার জন্য:

git remote update

15

এখানে .gitconfigওরফে বিভাগের ভিতরে বাশ স্ক্রিপ্ট সহ আমার উদাহরণ

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

7

আমি .git কংগিগিগ ফাইলে রিমোট "উত্স" এ দুটি পৃথক পুশরুল যুক্ত করেছি। আমি যখন রান করব git push origin "branchName"তখন এটি প্রতিটি ইউআরএল দিয়ে চলে যাবে। এটি সম্পাদন করার আরও সহজ উপায় আছে কিনা তা নিশ্চিত নন তবে এটি গিথুব সোর্স কোড এবং আপনার একই সাথে মাই.ভিজুয়াল স্টুডিও উত্স কোডে চাপ দেওয়ার জন্য কাজ করে।

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

4

আমি নোনা-উরবিজের কাছ থেকে উত্তরটি প্রসারিত করতে স্বাধীনতা নিয়েছি; কেবল এটি আপনার ~ / .bashrc এ যুক্ত করুন:

git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }    
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

ব্যবহার:

git-pullall master

git-pushall master ## or
git-pushall

আপনি যদি গিট-পুল্লের জন্য কোনও শাখা যুক্তি সরবরাহ না করেন তবে অ-ডিফল্ট অপসারণ থেকে টানা ব্যর্থ হবে; এই আচরণটি যেমন রয়েছে তেমনই ছেড়ে দিয়েছে, কারণ এটি গিটের সাথে সমান।


3

সেগুলি লুপ করার জন্য আপনার একটি স্ক্রিপ্ট দরকার হবে need গিট কোনও "সকলকে ধাক্কা" দেয় না। আপনি তাত্ত্বিকভাবে একাধিক থ্রেডে একটি ধাক্কা দিতে পারেন, তবে একটি স্থানীয় পদ্ধতি উপলব্ধ নেই।

আনতে আরও জটিল, এবং আমি লাইনারিভাবে এটি করার পরামর্শ দিই।

আমি মনে করি আপনার সেরা উত্তরটি হ'ল একবার এমন মেশিন থাকা উচিত যা যদি সম্ভব হয় তবে তা প্রত্যেকে টানুন / টানবেন।


2
সমস্যাটি হ'ল, যেমনটি আমি বর্ণনা করেছি, কোনও কেন্দ্রীয় সর্বদা উপলভ্য বক্স নেই। আমাকে যদি একটি লুপিং বাশ স্ক্রিপ্ট লিখতে হয় তবে তা
হ'ল

2
বিতরণ করা হচ্ছে, এটি ধরে নেওয়া হয় যে প্রত্যেকে উপলব্ধ নয়, বা তাদের কাছে ঠেলাঠেলি করতে চাইছিল। এটি বিভিন্ন রাজ্যে থাকা বিভিন্ন ভান্ডারগুলির সাথেও সম্পর্কিত এবং অন্যরা একই সাথে তাদের উপর কাজ করছে এমন ধারণাও সম্পর্কিত। সংগ্রহস্থলগুলির সেট থেকে আপনি যে ক্রমটি চাপছেন এবং টানছেন সেগুলি বিভিন্ন ভাণ্ডারগুলির অবস্থাকে প্রভাবিত করে এবং সেগুলি সত্যই সিঙ্ক করার জন্য আপনাকে একাধিক পাস করতে হবে। এ কারণেই কোনও "টান / ধাক্কা" নেই। তারপরেই দ্বন্দ্ব রয়েছে ...;)
জেফ ফেরল্যান্ড 11'09

3

রিমোটগুলি আপডেট করার জন্য (যেমন pullকেস) জিনিসগুলি সহজ হয়ে গেছে become

লিনাসের বক্তব্য

দুঃখের বিষয়, একটি গিট ওরফে দিয়ে এটি জাল করার কোনও উপায় নেই।

এ রেফারেন্সড এন্ট্রিতে গীত মেইলিং লিস্ট মধ্যে এর elliottcable উত্তর আর সত্য।

git fetchশিখেছি --allএক বারেই সব রিমোটের আনতে সক্ষম হবেন অতীতে প্যারামিটার কোথাও।

যদি সকলকে অনুরোধ না করা হয় তবে --multipleএকাধিক রিমোটস বা একটি গোষ্ঠী নির্দিষ্ট করার জন্য কেউ স্যুইচটি ব্যবহার করতে পারে ।


3

আমি ভিএসও / টিএফএসে কাজ করতে চেয়েছিলাম, তারপরে প্রস্তুত হওয়ার পরে প্রকাশ্যে গিটহাবের দিকে চাপ দিন। প্রাইভেট ভিএসওতে প্রাথমিক রেপো তৈরি করা হয়েছে। গিটহাবটিতে যুক্ত করার সময়টি আমি যখন করেছি:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master

চ্যাম্পের মতো কাজ করেছে ...

স্যানিটি পরীক্ষা করার জন্য, প্রকল্পের সাথে সম্পর্কিত সংগ্রহস্থলের তালিকা তৈরি করতে "গিট রিমোট-ভি" ইস্যু করুন।

C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v
githubrepo      https://github.com/jhealy/kinect2.git (fetch)
githubrepo      https://github.com/jhealy/kinect2.git (push)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)

সহজ উপায়, আমার জন্য কাজ ... আশা করি এটি কারও সাহায্য করবে।


4
git push -fকোনও কারণ ছাড়াই দৌড়ানো , উদাহরণস্বরূপ, ব্যর্থ হওয়া git pushবা একজন কী করছেন তা সঠিকভাবে জেনে যাওয়া, এটি একটি সম্ভাব্য ক্ষতিকারক ধারণা bad এটিও প্রশ্নের উত্তর দেয় না, তবে কীভাবে দ্বিতীয় রিমোট যুক্ত করা যায়।
কার্ল রিখটার

2

নীচের কমান্ডের সাহায্যে গ্লোবাল গিটকনফিগ (/home/user/.gitconfig) এ একটি নাম যুক্ত করুন।

git config --global alias.pushall '!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f'

আপনি কোডটি কমিট করলেই আমরা বলি

গিট ঠেলা

ডিফল্টরূপে উত্স দিকে ধাক্কা। উপরের উপন্যাসের পরে, আমরা বলতে পারি

গিট পুশাল

এবং কোডটি মূল রিমোট সহ সমস্ত রিমোটগুলিতে আপডেট করা হবে।


1

allআপনার ব্যবহৃত প্রতিটি মেশিনে আপনাকে সেটআপ করতে হওয়ায় রিমোট যুক্ত করা কিছুটা ক্লান্তিকর হয়ে ওঠে ।

এছাড়াও, bashএবং git এলিয়াসগুলি সমস্ত ধারনা সরবরাহ করেছে যে আপনার কাছে সমস্ত রিমোট স্থানান্তরিত হবে। (প্রাক্তন: আমি sshagগিটহাব এবং গিটল্যাবকে বজায় রেখেছি তার একটি কাঁটা রয়েছে I আমার কাছে উজানের রিমোট যুক্ত হয়েছে, তবে আমার তাতে প্রবেশ করার অনুমতি নেই))

এখানে এমন একটি git নাম রয়েছে যা কেবল একটি পুশ URL সহ রিমোটগুলিতে ধাক্কা দেয় @

psall    = "!f() { \
    for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
    git push $R $1; \
    done \
    }; f"

-3

নতুন রিমোট যুক্ত করা হচ্ছে

git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv

একাধিক অবস্থানের ফর্ম আনুন

git fetch --all

অবস্থানগুলিতে ঠেলাও

git push -u upstream/dev
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.