ローカルGitリポジトリをすべてのブランチとタグを含む新しいリモートにプッシュする


551

ローカルGitリポジトリがあり、それを新しいリモートリポジトリにプッシュしたい(重要な場合は、Beanstalkに設定された真新しいリポジトリ)。
私のローカルリポジトリにはいくつかのブランチとタグがあり、すべての履歴を保持したいと思います。

基本的にはを実行する必要git pushがあるだけのようですが、これはmasterブランチのみをアップロードします。

すべてをプッシュしてリモートのローカルリポジトリの完全なレプリカを取得するにはどうすればよいですか?


最短かつ最も簡単な答え-stackoverflow.com/a/39992258/6648326
MasterJoe2

回答:


898

すべてのブランチをプッシュするには、次のいずれかを使用します(REMOTEをリモートの名前、たとえば「origin」に置き換えます)。

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

すべてのタグをプッシュするには

git push REMOTE --tags

最後に、私はあなたがこれをすべて1つのコマンドで行うことができると思います:

git push REMOTE --mirror

ただし、さらに--mirrorはリモコンもプッシュするので、これは必ずしも望みどおりではない可能性があります。


53
--all*:*より友好的に見える代わりに
Idan K

56
私の神.............私はインターネット全体を引き裂き、私は `--all`スイッチがAAAAALLLLLLLLLLLLLL私が必要としていることを発見しました!
Rakib、2011年

21
ただ、ことは注目にgit push REMOTE --all戻っNo refs in common and none specified;ている間、何もしない。git push REMOTE "*:*実際にはリモートにすべてのブランチをプッシュ。
Im0rtality 2013

10
REMOTEで実際に更新したくないローカルの「tmp」または「feature」ブランチがある場合に、-dry-runを使用して何が起こるかを検査します
Jonno

55
元のリモートがまだ使用可能な場合は、使用することをお勧めしますgit clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
スザンヌデュペロン2014年

157

私のような場合、リポジトリを取得し、リモートの起点を別のリポジトリ、つまり新しい空のリポジトリに切り替えています...

だからあなたはあなたのリポジトリとすべてのブランチを持っていますが、それらのブランチをチェックアウトする必要があります git push --all、実際にそれらをプッシュするコマンドの。

プッシュする前にこれを行う必要があります。

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

に続く

git push --all

4
すべてのブランチを手動でチェックアウトする必要があったので、これも本当に役に立ちます。これは次回に適しています。
Cory Imdieke 2012年

10
奇妙なことに、git push '*:*'すべてのブランチをプッシュしました。git push -allちょうどマスターを押しました。リポジトリをgithubからbitbucketに転送していました。
jerrymouse 2013

3
すべてのブランチをチェックアウトする代わりに、「git branch --track $ remote」を実行するだけです。巨大なリポジトリでは、古いブランチをチェックアウトするのに時間がかかる
Moataz Elmasry 2014年

2
これを機能させるには、の--track remotes/$remote代わりに小さな変更を加える必要がありました--track $remote。ここでは、完全なコマンドラインです:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
エイドリアンT

おかげで、私にとってはうまくいきます。上記の答えもうまくいきません。
Benyamin Jafari

90

これは、私がいた状況でうまく機能した同じものの別の見方です。これは、複数のリモートがあり、リモートのすべてのブランチをリモートsourceに複製したいという問題を解決しますdestination事前にすべてをチェックアウトする必要がないします。

(ダニエルのソリューションで私が抱えていた問題は、source以前にチェックアウトしていた場合、リモートからトラッキングブランチをチェックアウトすることを拒否することでした。つまり、プッシュの前にローカルブランチを更新しませんでした)

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

注:直接CLIを使用していない場合は、アスタリスクをエスケープする必要があります。

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

これにより、リモートのすべてのブランチがsourceのヘッドブランチにプッシュされdestination、おそらく非早送りプッシュが実行されます。それでも、タグを個別にプッシュする必要があります。


8
+1これは私にとってはうまくいきましたremote。ありがとう!
ローレンス

4
私はアスタリスクをエスケープする必要がありました:git push destination +refs/remotes/source/\*:refs/heads/\*
mattalxndr 2014年

2
私にとって、これはHEADと呼ばれるブランチをプッシュすることになりましたが、このシナリオでは意図的ではないと思います。
maxwellb

1
この回答は私にとって非常に役に立ちました。このアスタリスクの使用に関するgit-push(1)のmanページでの唯一の言及は、--pruneオプションの小さな例です。
laindir 2016年

4
--mirror誰もが推奨する通常のパラメーターとは大きく異なる、素晴らしい答えです。自動化または監査の目的で2つのリモートの同期を維持したい場合に最適です。
Vinicius Xavier

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は一読の価値があります。このウェブサイトと組み合わせて私は次のように私の中に書きました.git/config

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

push = :「「一致する」ブランチ(つまり、リモートリポジトリにすでに存在し、ローカルに対応するブランチがあるブランチ)をプッシュする」という意味ですが、push = refs/tags/*手段「はすべてのタグをプッシュします」。

したがって、実行git pushする必要があるのは、一致するすべてのブランチとすべてのタグをプッシュするためだけです。

はい、これはOPが望んだものではありません(プッシュするすべてのブランチがリモート側に既に存在している必要があります)が、「ブランチとタグを同時にプッシュするにはどうすればよいですか?」時間"。


13

私の場合、うまくいったのは

git push origin --all

4
シンプルで簡単。できます!originリモートURL Gitリポジトリのエイリアスです。
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 Large File Storageオブジェクトを含むリポジトリのミラーリング

リポジトリのベアクローンを作成します。サンプルのユーザー名をリポジトリを所有する人または組織の名前に置き換え、サンプルのリポジトリ名を複製するリポジトリの名前に置き換えます。

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

クローンしたリポジトリに移動します。

cd old-repository.git

リポジトリのGit Large File Storageオブジェクトを取得します。

git lfs fetch --all

新しいリポジトリにミラープッシュします。

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

リポジトリのGit Large File Storageオブジェクトをミラーにプッシュします。

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

手順1で作成した一時的なローカルリポジトリを削除します。

cd ..
rm -rf old-repository.git

上記の説明はGithubヘルプから提供されますhttps : //help.github.com/articles/duplicating-a-repository/


1
これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょうより適切な「リンクベース」の回答を作成する方法については、こちらをご覧ください。ありがとう!
GhostCat 2018

5

上記の回答にはまだ不明な点がいくつかあり、ユーザーを誤解させます。まず、それはそれは間違いないだろうgit push new_origin --allgit push new_origin --mirror起源のすべての分岐を複製することはできません、それはちょうどあなたのnew_originにお住まいの地域に存在支店を複製します。

以下は、私がテストした2つの便利な方法です。

1、クローンベアレポで複製します。git clone --bare origin_url、次にフォルダを入力しますgit push new_origin_url --mirror。このようにしてgit clone --mirror origin_url、両方--bareを使用して、--mirrorワークスペースを含まないベアリポジトリをダウンロードすることもできます。これを参照してください

2、使用してgitリポジトリがある場合git clone、つまり、ベアリポジトリとgitワークスペースがある場合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、gitでは許可されていないようです。


別のリモートからプッシュするための追加オプションはありますか?たとえば付き+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ができます。また、ネクロポスティングで申し訳ありません。この回答が今日私に役立っただけです。私の立場にいる他の人を助けることができる場合は、私の変更を共有したいと思います...
ToVine

1

これらのどれも私には適切に機能していないようでした。これを自由に火にかけて死に至らせてください。しかし、何らかの理由で他のオプションを適切に機能させることができませんでした。

期待される結果は、別のリモート(つまり、Githubから別のプロバイダー)に「クローン」されたリポジトリでした。

  • すべてのブランチは新しいリモートで作成されます
  • すべてのブランチ履歴が新しいリモートで作成されます
    • (これは私が試したすべてのソリューションで見逃されていました)
  • すべてのタグは新しいリモートで作成されます
  • ソースが移動します(与えられた)
  • 非破壊的(--mirrorオプションに一時停止を与える)

私が目にした主な問題は、すべてのリモートブランチが新しいリモートで再作成されなかったかのどちらかでした。コマンドが実行された場合、新しいリモートにはブランチ履歴がありません(つまり、git checkout branch; git logがありませんでしをも予期されたブランチコミットが表示されません)。

git checkout -b branchnamegit checkout branchname(後者は私が必要とするものである)と同じではないことに気づきました。私は気づくgit checkout --track branchname分岐履歴を引くようには見えませんでした。

私のソリューション(Powershellベース):

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リポジトリに存在するものを含め、)で確認できますgit branch -a

git push origin '*:*'

注:(バージョン管理サービスを移行する場合は、このコマンドは便利来るすなわちからの移行GitlabGitHubの


1
バージョン管理サービスとこれの間の移行はまさに私が探しているものです、乾杯!
LukaŠpoljarić

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.