Gitリポジトリのコンテンツを、履歴を保持する別のリポジトリに移動する


141

次のコマンドを使用して、1つのリポジトリ(repo1)のコンテンツのみを別の既存のリポジトリ(repo2)に移動しようとしています。

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

しかし、それは機能していません。同様の投稿を確認しましたが、フォルダを移動しているのは1つだけで、コンテンツは移動していません。


repo1の内容をrepo2のブランチとして、またはマスターの一部として、両方のreposのフォルダーが作業ディレクトリに共存するようにしますか?
クロニアル2013年

マスターの一部として動かしたいです。
マリオ

4
このチュートリアルは完璧です!smashingmagazine.com/2014/05/19/...
xpto

回答:


242

あなたが探しているコマンドは次のとおりです。

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

その後repo2/masterからすべてを含んでいますrepo2/masterrepo1/master、また、それらの両方の歴史を持っています。


Chronialに感謝します。repo1にも1つのブランチがあることを確認したいのですが、そのブランチをrepo2にも移動したい場合はどうしますか?
マリオ

さて、repo2には2番目のブランチもありますか?または、そのブランチはどうなりますか?
クロニアル2013年

1
クロニアル、上記のコマンドは機能しませんでした!それは歴史をコピーしませんでした。
マリオ

1
OK、今はうまくいきました。次のコマンドを使用しました。cdrepo2、> git remote rm origin> git remote add origin url-of-repo1、> git fetch r1remote> git push origin master
Mario

1
@abhijithda最も簡単な解決策は、マージを行う前repo1に、すべてを内部(サブフォルダーrepo1)に移動することです。
クロニアル

55

ここに完全に説明されていますhttps://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

まず、既存のリポジトリからローカルインデックスにすべてのリモートブランチとタグをフェッチする必要があります。

git fetch origin

次のローカルコピーを作成するために必要な、不足しているブランチを確認できます。

git branch -a

新しいリポジトリのSSHクローンURLを使用して、既存のローカルリポジトリに新しいリモートを作成します。

git remote add new-origin git@github.com:manakor/manascope.git

これで、すべてのローカルブランチとタグをnew-originという名前の新しいリモートにプッシュする準備ができました。

git push --all new-origin 
git push --tags new-origin

new-originをデフォルトのリモートにしましょう:

git remote rm origin

new-originの名前をoriginに変更して、デフォルトのリモートになるようにします。

git remote rename new-origin origin

4
これが履歴とタグ全体をコピーしていることを確認できます。非常に素晴らしい。ありがとう。
Alex

new-originにコミットがない場合、うまく機能します。ただし、new-originにコミットがある場合、ここで述べた方法は期待どおりに機能しません。
1

git checkout BranchNameブランチをswtichしてからリモートリポジトリにブランチを再度プッシュする必要がありますがgit push --all new-origin 、おかげで
Raad Altaie

21

既存のブランチとコミット履歴を保持したい場合は、次の方法が役立ちました。

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

ここで、ソースと宛先のリポジトリを一定期間同期させておきたいとします。たとえば、現在のリモートリポジトリ内に、新規/交換用リポジトリに持ち越したいアクティビティがまだあります。

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

最新の更新をプルダウンするには(ローカルに変更がない場合):

git checkout {branch(es) of interest}
git pull old
git push --all new

注:サブモジュールをまだ使用していないため、サブモジュールがある場合に必要な追加の手順がわかりません。


1
これは私にとって簡単かつ簡単に機能しました。正解かと思います。60のブランチがある場合、これが先の方法です。
rickfoosusa

7

コードがすでにGitによって追跡されている場合の最も簡単なアプローチは、新しいリポジトリをプッシュ先の「オリジン」として設定します。

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

これにより、ローカルリポジトリ(履歴を含む)をリモートのgithub.comリポジトリに移動することができました。GitHub.comで新しい空のリポジトリを作成した後、以下の手順3でURLを使用しました。

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

私はこれを見つけました:https//gist.github.com/niksumeiko/8972566


1
これは、元のリポジトリを作成する最も簡単な方法です。また、すべてのブランチをコピーします。
ギジェルモ

1
これにより、すべてのタグもコピーされます。
レイヴン

2

以下の方法を使用して、すべてのブランチとコミット履歴を維持することにより、GIT StashをGitLabに移行しました。

古いリポジトリのクローンをローカルに作成します。

git clone --bare <STASH-URL>

GitLabで空のリポジトリを作成します。

git push --mirror <GitLab-URL>

1

近くにいるようです。それがあなたの提出の単なるタイプミスではないと仮定すると、ステップ3 cd repo2はrepo1の代わりにすべきです。そして、ステップ6はgit pullプッシュしないでください。再加工されたリスト:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Ericに感謝しますが、ステップ3で、リモートの変更を行わないように元のリポジトリのリンクを削除したいと思います。repo1からrepo2にコンテンツを移動したいからです。
マリオ

よし。私はそれを反映するように私の回答を編集しました。念のため、リポジトリrepo2を作成しようとしています。これはrepo1のコピーですが、repo1またはoriginをリモートとして保持していませんか?
エリックパレス

いいえ、新しいレポ「repo2」を作成するつもりはありません。実際には、他のコンテンツinitを持つ既存のrepo2があります。次に、repo1のすべてのコンテンツを履歴のあるrepo2に移動します。サーバー内にあるrepo1は空のままにします。
マリオ

gitを使用しないことを検討しましたか?おそらくファイルを(guiまたはscpまたはftpを介して)コピーし、手動でgitリポジトリに追加できるようです。効率的ではないかもしれませんが、おそらくより簡単です。
エリックパレス

私はすでにそれを試しました、しかしそれは歴史を残しました。私もその歴史のすべてを動かしたいと思います。
マリオ

1

@ Dan-Cohnの回答のとおり、Mirror-pushはあなたの友達です。これはレポジトリを移行するための私の行くところです:

リポジトリのミラーリング

1.Git Bashを開きます。

リポジトリのベアクローンを作成します。

$ 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

リファレンスとクレジット:https : //help.github.com/en/articles/duplicating-a-repository


-1

ここには多くの複雑な答えがあります。ただし、ブランチの保存に関心がない場合は、リモートオリジンをリセットし、アップストリームを設定してプッシュするだけです。

これにより、すべてのコミット履歴が保持されました。

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.