স্থানীয় গিট রেপোকে সমস্ত শাখা এবং ট্যাগ সহ নতুন রিমোটে পুশ করুন


551

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

দেখে মনে হচ্ছে আমার মূলত একটি কাজ করা দরকার git pushতবে এটি কেবল masterশাখাটি আপলোড করে ।

আমি কীভাবে সমস্ত কিছু চাপব যাতে আমি রিমোটে আমার স্থানীয় রেপোর সম্পূর্ণ প্রতিলিপি পাই?


সবচেয়ে সংক্ষিপ্ত এবং সহজ উত্তর - stackoverflow.com/a/39992258/6648326
মাস্টারজয়ে 2

উত্তর:


898

ধাক্কা সব আপনার শাখা , ব্যবহার হয় (দূরবর্তী নাম রিমোট প্রতিস্থাপন, উদাহরণস্বরূপ "উত্স" জন্য):

git push REMOTE '*:*'
git push REMOTE --all

আপনার সমস্ত ট্যাগ পুশ করতে :

git push REMOTE --tags

পরিশেষে, আমি মনে করি আপনি এক কমান্ডের সাহায্যে এইগুলি করতে পারেন:

git push REMOTE --mirror

তবে --mirrorএটির পাশাপাশি , আপনার রিমোটগুলিও চাপ দেবে, সুতরাং এটি আপনি যা চান ঠিক তেমন নাও হতে পারে।


53
--allপরিবর্তে *:*আরও বন্ধুত্বপূর্ণ বলে মনে হচ্ছে
ইডান কে

56
আমার godশ্বর ............. আমি পুরো ইন্টারনেটটি ছিঁড়ে ফেলেছি এবং আমি জানতে পেরেছি `- সমস্ত` স্যুইচটি আমার দরকার এএএএএএলএলএলএলএলএলএলএলএল!
রাকিব

21
কেবল লক্ষ্য করেই কিছু git push REMOTE --allফিরে No refs in common and none specified;আসেনি,, যখন git push REMOTE "*:*প্রকৃতপক্ষে সমস্ত শাখা প্রত্যন্তে ঠেলেছে।
im0rtality

10
স্থানীয়ভাবে "টিএমপি" বা "বৈশিষ্ট্য" শাখাগুলি আছে যা আপনি সত্যিই রিমোটে আপডেট করতে চান না
জোনো

55
যদি আসল রিমোটটি এখনও উপলব্ধ থাকে তবে এটি করা খুব ভাল git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
সুজান ডুপোরন

156

আমার মতো ক্ষেত্রে যে আপনি একটি রেপো অর্জন করেছিলেন এবং এখন দূরবর্তী উত্সকে অন্য একটি রেপোতে স্যুইচ করছেন, একটি নতুন খালি ...

সুতরাং আপনার ভিতরে আপনার রেপো এবং সমস্ত শাখা রয়েছে তবে git push --allকমান্ডের জন্য প্রকৃতপক্ষে সেগুলি খুব ধাক্কা দেওয়ার জন্য আপনাকে এখনও সেই শাখাগুলি চেকআউট করতে হবে।

চাপ দেওয়ার আগে আপনার এটি করা উচিত:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

অনুসরণ করেছে

git push --all

4
এটি সত্যই সহায়ক, কারণ আমাকে নিজে সমস্ত শাখাটি চেকআউট করতে হয়েছিল। এটি পরবর্তী সময়ের জন্য ভাল হবে be
কোরি ইমডিক

10
আশ্চর্যের সাথে, git push '*:*'সমস্ত শাখা ঠেলা। git push -allসবেমাত্র মাষ্টারকে ধাক্কা দিলাম। আমি গিথুব থেকে বিটবাকেটে রেপো পরিবহন করছিলাম।
জেরিমাউস

3
প্রতিটি একক শাখা পরীক্ষা করার পরিবর্তে আপনার কেবল "গিট শাখা - ট্র্যাক $ রিমোট" করা উচিত। বিশাল ভাণ্ডারগুলিতে একটি পুরানো শাখাটি পরীক্ষা করতে কিছু সময় লাগে
মোতাজ এলমাস্রি

2
এই কাজ করার জন্য আমাকে একটি ছোট পরিবর্তন করতে হয়েছিল: --track remotes/$remoteপরিবর্তে --track $remote। এখানে সম্পূর্ণ কমান্ড লাইন:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
অ্যাড্রিয়ান টি

ধন্যবাদ, এটি আমার পক্ষে কাজ করে, উপরের উত্তরগুলিও কাজ করে না।
বেনিয়ামিন জাফারি

90

আমি যে পরিস্থিতিটি ছিলাম তার জন্য আরও ভালভাবে কাজ করা একই জিনিসটি এখানে নিতে হবে It এটি আপনার সমস্যার সমাধান করে যেখানে আপনার একাধিক দূরবর্তী রয়েছে, দূরবর্তী sourceথেকে দূরবর্তী সমস্ত শাখা ক্লোন করতে চানdestination কিন্তু পূর্বেই সকলকে বাইরে বার চেক না করে।

(ড্যানিয়েলের সমাধানে আমার যে সমস্যাটি হয়েছিল তা হ'ল এটি sourceযদি আমি ইতিমধ্যে এটি ইতিমধ্যে পরীক্ষা করে দেখি তবে এটি রিমোট থেকে একটি ট্র্যাকিং শাখা চেক আউট করতে অস্বীকার করবে, এটি আমার স্থানীয় শাখাটিকে ধাক্কা দেওয়ার আগে আপডেট করবে না)

git push destination +refs/remotes/source/*:refs/heads/*

দ্রষ্টব্য: আপনি যদি সরাসরি সিএলআই ব্যবহার না করে থাকেন তবে আপনাকে অবশ্যই তারকাচিহ্নগুলি থেকে রক্ষা করতে হবে:

git push destination +refs/remotes/source/\*:refs/heads/\*

এটি দূরবর্তী সমস্ত শাখাকে sourceএকটি প্রধান শাখায় ঠেলে দেবে destination, সম্ভবত একটি নন-ফাস্ট-ফরওয়ার্ড পুশ করবে। আপনাকে এখনও আলাদাভাবে ট্যাগ ঠেকাতে হবে।


8
+1 এটি আমার পক্ষে কাজ করেছিল, remoteএকে অপরের থেকে ক্লোন করে। ধন্যবাদ!
লরেন্স

4
আমাকে git push destination +refs/remotes/source/\*:refs/heads/\*
নক্ষত্রগুলি

2
আমার জন্য, এই হেড নামক একটি শাখাটিকে চাপ দিচ্ছে যা আমি এই দৃশ্যে ইচ্ছাকৃত বলে মনে করি না।
ম্যাক্সওয়েলব

1
এই উত্তরটি আমার পক্ষে অবিশ্বাস্যভাবে কার্যকর ছিল। তারকাচিহ্নগুলির এই ব্যবহারের গিট-পুশ (1) ম্যান পৃষ্ঠায় কেবলমাত্র উল্লেখটিই --pruneবিকল্পটির জন্য ক্ষুদ্র উদাহরণ হিসাবে রয়েছে ।
লিন্ডির

4
সর্বোত্তম উত্তর, সাধারণ --mirrorপ্যারামিটারের তুলনায় সবাই আলাদাভাবে সুপারিশ করে। দৃশ্যাবলীর জন্য পুরোপুরি কাজ করে যেখানে আপনি কেবল অটোমেশন বা অডিটিংয়ের জন্য দুটি রিমোট সিঙ্ক করতে চান।
ভিনিসিয়াস জাভিয়ার

15

এটি আমি খুঁজে পেয়েছি সবচেয়ে সংক্ষিপ্ত উপায়, গন্তব্যটি খালি থাকলে। একটি খালি ফোল্ডারে স্যুইচ করুন এবং তারপরে:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

উপযুক্ত হিসাবে ইত্যাদি https://...জন্য বিকল্প file:///your/repo


13

ম্যানপেজটি git-pushপড়ার মতো worth এই ওয়েবসাইটটির সাথে একত্রিত হয়ে আমি আমার মধ্যে নিম্নলিখিতটি লিখেছি .git/config:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

এর push = :অর্থ, "কোনও 'মিলে যাওয়া' শাখাগুলিকে ঠেলাও (অর্থাৎ যে শাখাগুলি ইতিমধ্যে দূরবর্তী সংগ্রহস্থলে উপস্থিত রয়েছে এবং স্থানীয় অংশ রয়েছে)", যখনpush = refs/tags/* অর্থ "সমস্ত ট্যাগ চাপুন"।

সুতরাং এখন আমাকে কেবল git pushসমস্ত মেলানো শাখা এবং সমস্ত ট্যাগ পুশ করতে হবে।

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


13

আমার ক্ষেত্রে যা কাজ হয়েছিল তা ছিল।

git push origin --all

4
সহজ এবং সহজ। এটি কাজ করে! originরিমোট ইউআরএল গিট সংগ্রহস্থলের জন্য নাম।
Nhu Vy

8

একটি ভান্ডার মিরর করছি

ভান্ডারগুলির একটি খালি ক্লোন তৈরি করুন।

git clone --bare https://github.com/exampleuser/old-repository.git

নতুন সংগ্রহস্থলে মিরর-পুশ।

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

পদক্ষেপ 1-এ আপনি তৈরি অস্থায়ী স্থানীয় সংগ্রহস্থল সরান।

cd ..
rm -rf old-repository.git

একটি সংগ্রহস্থল মিরর করা হচ্ছে যাতে গিট লার্জ ফাইল স্টোরেজ অবজেক্ট থাকে

ভান্ডারগুলির একটি খালি ক্লোন তৈরি করুন। উদাহরণটি ব্যবহারকারীর নামটি সেই ব্যক্তি বা সংস্থার নামের সাথে প্রতিস্থাপন করুন যিনি ভাণ্ডারটির মালিক, এবং উদাহরণটি সংগ্রহস্থলের নামটি আপনি যে নকল করতে চান তার নামের সাথে প্রতিস্থাপন করুন।

git clone --bare https://github.com/exampleuser/old-repository.git

আপনি সবেমাত্র ক্লোন করেছেন এমন ভাণ্ডারগুলিতে নেভিগেট করুন।

cd old-repository.git

সংগ্রহস্থলের গিট লার্জ ফাইল স্টোরেজ অবজেক্টগুলিতে টানুন।

git lfs fetch --all

নতুন সংগ্রহস্থলে মিরর-পুশ।

git push --mirror https://github.com/exampleuser/new-repository.git

সংগ্রহস্থলের গিট লার্জ ফাইল স্টোরেজ অবজেক্টগুলিকে আপনার আয়নাতে চাপ দিন।

git lfs push --all https://github.com/exampleuser/new-repository.git

পদক্ষেপ 1-এ আপনি তৈরি অস্থায়ী স্থানীয় সংগ্রহস্থল সরান।

cd ..
rm -rf old-repository.git

উপরোক্ত নির্দেশনাটি গিথুব সহায়তা থেকে আসে: https://help.github.com/articles/dusedating-a-repository/


1
যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান। কীভাবে আরও ভাল "লিঙ্ক ভিত্তিক" উত্তর লিখতে হয় তার নির্দেশাবলীর জন্য এখানে দেখুন । ধন্যবাদ!
ঘোস্টগেট

5

আমি উপরের উত্তরগুলিতে এখনও কিছু অস্পষ্ট জিনিস রয়েছে যা ব্যবহারকারীদের বিভ্রান্ত করবে found প্রথমত, এটি নিশ্চিত যে git push new_origin --allএবং git push new_origin --mirrorউত্সের সমস্ত শাখাকে সদৃশ করতে পারে না, এটি কেবলমাত্র আপনার স্থানীয় বিদ্যমান শাখাগুলিকে আপনার নিউ_রিগিনে নকল করে।

নীচে আমি দুটি দরকারী পদ্ধতি পরীক্ষা করেছি:

1, ক্লোন বেয়ার রেপো দ্বারা সদৃশ। git clone --bare origin_urlতারপর, ফোল্ডারের লিখুন, এবং git push new_origin_url --mirror.By এই ভাবে, আপনি ব্যবহার করতে পারেন git clone --mirror origin_url, উভয় --bareএবং --mirrorএকটি খালি রেপো, কর্মক্ষেত্র সহ না ডাউনলোড করবে। দয়া করে এটি উল্লেখ করুন

2, যদি আপনার গিট রেপো ব্যবহার করে থাকে git cloneযার অর্থ আপনার কাছে খালি রেপো এবং গিট ওয়ার্কস্পেস রয়েছে তবে আপনি ব্যবহার করতে পারেন git remote add new_origin new_origin_urlএবং তারপরে git push new_origin +refs/remotes/origin/\*:refs/heads/\*এবং তারপরেgit push new_origin --tags

এইভাবে, আপনি একটি অতিরিক্ত মাথা শাখা পাবেন, যা কোনও অর্থ দেয় না।


2

শাখা এবং ট্যাগ পুশ করতে (তবে দূরবর্তী নয়):

git push origin 'refs/tags/*' 'refs/heads/*'

এটি এর জন্য --tagsএবং --allবিকল্পগুলির সমন্বয়ের সমতুল্য git push, যা গিটকে অনুমতি দেয় না বলে মনে হয়।


অন্য দূরবর্তী থেকে ধাক্কা দেওয়ার অতিরিক্ত বিকল্প আছে? উদাহরণস্বরূপ+refs/remotes/source/*
ইয়ভেস মার্টিন

2

@ ডানিয়েলে ভিত্তিক উত্তরের আমি করেছি:

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

2
আরও ভাল, এর | grep -v masterসাথে প্রতিস্থাপন করা যেতে পারে | sed 's/\*//'( বর্তমানে নির্বাচিত শাখায় প্রিপেন্ড করা কদর্যতা masterএড়াতে আমি আপনাকে বাদ দিয়েছি *) যা আপনার বর্তমানে নির্বাচিত শাখাটি না থাকলে আপনাকে masterকোনও সমস্যা অন্তর্ভুক্ত করতে এবং এড়াতে সহায়তা করে master। নেক্রোপোস্টিংয়ের জন্য দুঃখিত, এটি ঠিক যে এই উত্তরটি আজ আমাকে সহায়তা করেছে এবং আমি যদি আমার অবস্থানটিতে অন্যদের সহায়তা করতে পারি তবে আমি আমার পরিবর্তনটি ভাগ করতে চাই ...
টোভাইন

1

আমি দেখেছি যে এগুলির কোনওটিই আমার পক্ষে সঠিকভাবে কাজ করছে বলে মনে হয় না। এটিকে মৃত্যুর আগুনে নির্দ্বিধায় ফেলুন তবে কোনও কারণে সঠিকভাবে কাজ করার জন্য অন্যান্য বিকল্পগুলি পেতে পারেন নি।

প্রত্যাশিত ফলাফলটি ছিল অন্য কোনও রিমোটের (যেমন গিথুব থেকে অন্য সরবরাহকারীর কাছে) "ক্লোনড":

  • সমস্ত শাখা নতুন রিমোটে তৈরি করা হয়েছে
  • সমস্ত শাখার ইতিহাস নতুন রিমোটে তৈরি করা হয়েছে
    • (আমি চেষ্টা করেছি এমন প্রতিটি সমাধানে এটি মিস হয়েছিল)
  • সমস্ত ট্যাগ নতুন রিমোটে তৈরি করা হয়
  • উত্স সরানো (একটি প্রদত্ত)
  • অ-ধ্বংসাত্মক (--মিরর বিকল্পটিতে বিরতি দেওয়া)

আমি যে প্রধান সমস্যাটি দেখছিলাম তা হ'ল হয় সমস্ত রিমোট শাখাগুলি নতুন রিমোটে পুনরায় তৈরি করা হয়নি। যদি কোনও কমান্ডটি করে থাকে তবে নতুন রিমোটটির শাখার ইতিহাস নেই (যেমন একটি করাgit checkout branch; git log প্রত্যাশিত শাখাটি কমিট করে না)।

আমি লক্ষ্য করেছি git checkout -b branchnameযে git checkout branchname(আমার যা প্রয়োজন পরে তা হচ্ছে) এর মতো নয়। আমি লক্ষ্য git checkout --track branchnameকরেছি যে শাখার ইতিহাস টানতে দেখা যায়নি।

আমার সমাধান (পাওয়ারশেল ভিত্তিক):

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure

1

নীচের কমান্ডটি সমস্ত শাখাগুলি ঠেলে দেবে (এমন একটি শাখা সহ যা আপনি কখনও চেক আউট করেননি তবে আপনার গিট রেপোতে উপস্থিত রয়েছে, আপনি সেগুলি দেখতে পারেনgit branch -a )

git push origin '*:*'

উল্লেখ্য: এই কমান্ডের কুশলী আসে যখন আপনি সংস্করণ নিয়ন্ত্রণ সার্ভিস (স্থানান্তরিত করছি IE থেকে মাইগ্রেট Gitlab করার GitHub )


1
সংস্করণ নিয়ন্ত্রণ পরিষেবাদির মধ্যে স্থানান্তরিত করা এবং এটি ঠিক আমি অনুসন্ধান করছি, চিয়ার্স!
লুকা পোপজারিć

1

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

উপরে অর্জনের জন্য আমি পরবর্তীটি করেছি:

  • স্থানীয় সংগ্রহস্থলে সমস্ত শাখাকে ম্যানুয়ালি চেকআউট করুন (নীচে দেখানো সমস্ত চেকআউট করার জন্য স্ক্রিপ্ট),
  • git push origin '*:*'

.sh স্ক্রিপ্ট স্থানীয় শাখায় সমস্ত শাখা চেকআউট করতে ব্যবহৃত:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.