ローカルGitリポジトリがあり、それを新しいリモートリポジトリにプッシュしたい(重要な場合は、Beanstalkに設定された真新しいリポジトリ)。
私のローカルリポジトリにはいくつかのブランチとタグがあり、すべての履歴を保持したいと思います。
基本的にはを実行する必要git push
があるだけのようですが、これはmaster
ブランチのみをアップロードします。
すべてをプッシュしてリモートのローカルリポジトリの完全なレプリカを取得するにはどうすればよいですか?
ローカルGitリポジトリがあり、それを新しいリモートリポジトリにプッシュしたい(重要な場合は、Beanstalkに設定された真新しいリポジトリ)。
私のローカルリポジトリにはいくつかのブランチとタグがあり、すべての履歴を保持したいと思います。
基本的にはを実行する必要git push
があるだけのようですが、これはmaster
ブランチのみをアップロードします。
すべてをプッシュしてリモートのローカルリポジトリの完全なレプリカを取得するにはどうすればよいですか?
回答:
すべてのブランチをプッシュするには、次のいずれかを使用します(REMOTEをリモートの名前、たとえば「origin」に置き換えます)。
git push REMOTE '*:*'
git push REMOTE --all
git push REMOTE --tags
最後に、私はあなたがこれをすべて1つのコマンドで行うことができると思います:
git push REMOTE --mirror
ただし、さらに--mirror
はリモコンもプッシュするので、これは必ずしも望みどおりではない可能性があります。
--all
*:*
より友好的に見える代わりに
git push REMOTE --all
戻っNo refs in common and none specified;
ている間、何もしない。git push REMOTE "*:*
実際にはリモートにすべてのブランチをプッシュ。
git clone --mirror old-remote-url; cd repo.git; git push --mirror new-remote-url
。
私のような場合、リポジトリを取得し、リモートの起点を別のリポジトリ、つまり新しい空のリポジトリに切り替えています...
だからあなたはあなたのリポジトリとすべてのブランチを持っていますが、それらのブランチをチェックアウトする必要があります git push --all
、実際にそれらをプッシュするコマンドの。
プッシュする前にこれを行う必要があります。
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
に続く
git push --all
git push '*:*'
すべてのブランチをプッシュしました。git push -all
ちょうどマスターを押しました。リポジトリをgithubからbitbucketに転送していました。
--track remotes/$remote
代わりに小さな変更を加える必要がありました--track $remote
。ここでは、完全なコマンドラインです:for remote in `git branch -r | grep -v master `; do git checkout --track remotes/$remote ; done
これは、私がいた状況でうまく機能した同じものの別の見方です。これは、複数のリモートがあり、リモートのすべてのブランチをリモートsource
に複製したいという問題を解決しますdestination
事前にすべてをチェックアウトする必要がないします。
(ダニエルのソリューションで私が抱えていた問題は、source
以前にチェックアウトしていた場合、リモートからトラッキングブランチをチェックアウトすることを拒否することでした。つまり、プッシュの前にローカルブランチを更新しませんでした)
git push destination +refs/remotes/source/*:refs/heads/*
注:直接CLIを使用していない場合は、アスタリスクをエスケープする必要があります。
git push destination +refs/remotes/source/\*:refs/heads/\*
これにより、リモートのすべてのブランチがsource
のヘッドブランチにプッシュされdestination
、おそらく非早送りプッシュが実行されます。それでも、タグを個別にプッシュする必要があります。
remote
。ありがとう!
git push destination +refs/remotes/source/\*:refs/heads/\*
--prune
オプションの小さな例です。
--mirror
誰もが推奨する通常のパラメーターとは大きく異なる、素晴らしい答えです。自動化または監査の目的で2つのリモートの同期を維持したい場合に最適です。
これは、宛先が空であるという条件で、私が見つけた最も簡潔な方法です。空のフォルダーに切り替えてから:
# 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
適宜など。
のマンページgit-push
は一読の価値があります。このウェブサイトと組み合わせて、私は次のように私の中に書きました.git/config
:
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
push = :
「「一致する」ブランチ(つまり、リモートリポジトリにすでに存在し、ローカルに対応するブランチがあるブランチ)をプッシュする」という意味ですが、push = refs/tags/*
手段「はすべてのタグをプッシュします」。
したがって、実行git push
する必要があるのは、一致するすべてのブランチとすべてのタグをプッシュするためだけです。
はい、これはOPが望んだものではありません(プッシュするすべてのブランチがリモート側に既に存在している必要があります)が、「ブランチとタグを同時にプッシュするにはどうすればよいですか?」時間"。
リポジトリのミラーリング
リポジトリのベアクローンを作成します。
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/
上記の回答にはまだ不明な点がいくつかあり、ユーザーを誤解させます。まず、それはそれは間違いないだろうgit push new_origin --all
とgit 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
この方法で、意味のない余分なヘッドブランチを取得します。
私がした@ダニエルの回答に基づいています:
for remote in \`git branch | grep -v master\`
do
git push -u origin $remote
done
| grep -v master
を置き換えて| sed 's/\*//'
(現在選択されているブランチの前に付加されるmaster
厄介な問題を回避するために除外されていると想定しています*
)、現在選択されているブランチmaster
でない場合に問題を含めて回避することmaster
ができます。また、ネクロポスティングで申し訳ありません。この回答が今日私に役立っただけです。私の立場にいる他の人を助けることができる場合は、私の変更を共有したいと思います...
これらのどれも私には適切に機能していないようでした。これを自由に火にかけて死に至らせてください。しかし、何らかの理由で他のオプションを適切に機能させることができませんでした。
期待される結果は、別のリモート(つまり、Githubから別のプロバイダー)に「クローン」されたリポジトリでした。
私が目にした主な問題は、すべてのリモートブランチが新しいリモートで再作成されなかったかのどちらかでした。コマンドが実行された場合、新しいリモートにはブランチ履歴がありません(つまり、git checkout branch; git log
がありませんでしをも予期されたブランチコミットが表示されません)。
私git checkout -b branchname
はgit 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
以下のコマンドは、すべてのブランチをプッシュします(まだチェックアウトしていないものの、gitリポジトリに存在するものを含め、)で確認できますgit branch -a
)
git push origin '*:*'
注:(バージョン管理サービスを移行する場合は、このコマンドは便利来るすなわちからの移行GitlabにGitHubの)
あるバージョンコントロールサービスから別のバージョンコントロールサービスに切り替える途中で、すべてのブランチ、タグ、履歴を含むすべてのリポジトリを複製する必要がありました。
上記を達成するために私は次のことをしました:
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