Gitリポジトリ間でコミットをコピーする方法は?


96

先週、Githubリポジトリを作成しましたが、リポジトリのライセンスを選択するのを忘れていました。現在、すでに3つの大きなコミットがあります。

私は3人のコントリビューターに大丈夫かどうか、リポジトリを削除してから同じ名前でもう一度作成するかどうかを尋ねましたが、今回はリポジトリの作成時にライセンスを選択しました。

質問

コミットを新しいリポジトリ(今回は最初のコミットはLICENSEファイルです)に入れ、それでもコミットメタ情報を保持する方法はありますか?


1
元のリポジトリにライセンスを追加できます。詳細については、help.github.com / articles / open-source-licensing /…をご覧ください。
edwinksl 2016年

回答:


163

コミットを新しいリポジトリ(今回は最初のコミットはLICENSEファイルです)に入れ、それでもコミットメタ情報を保持する方法はありますか?

はい、リモートを追加して、最初のコミットの上にコミットを選択します。

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

この答えの残りは、以前のリポジトリにライセンスを追加したい場合です。

はい。LICENSEコミットを最初のコミットとしてリベースすることができます。

リベースは、すべてのコミットの作成者とコミット日付をそのままに保ちながら、gitのコミット順を並べ替える方法です。

共有レポで作業する場合、チーム全体がgit-fluentでない限り、通常は推奨されません。そうでない場合は、リポジトリの新しいコピーを複製するだけです。

ここでは、最初のコミットとしてLICENSEコミットを取得する方法を示します。

1.ローカルコピーを更新してリベースする

プロジェクトをチェックアウトし、現在の3コミットスタックのコミットON TOPにLICENSEファイルを配置します。

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

次に、masterブランチでインタラクティブなリベースを実行して、コミットを再配置します。

git rebase -i --root

エディターが開きます。一番下の行(「最初のコミット」コミット、最新のコミット)をファイルの一番上に移動します。次に、エディターを保存して終了します。

エディターを終了するとすぐに、gitは指定した順序でコミットを書き込みます。

これで、リポジトリのローカルコピーが更新されました。行う:

git log

検証します。

2.新しいレポ状態を強制的にgithubにプッシュします

コピーが更新されたので、githubに強制的にプッシュする必要があります。

git push -f origin master

これにより、githubにマスターブランチを新しい場所に移動するように指示します。このようなまれな場合にのみプッシュを強制する必要があります。プッシュを使用しているすべての人が保留中の変更を認識している場合のみです。そうしないと、共同編集者が混乱します。

3.共同編集者をgithubに同期する

最後に、すべての共同編集者がこのリポジトリに同期する必要があります。

保存されていない変更がある場合、次のコマンドは破壊的なものになる可能性があるため、最初にそれらにはクリーンなリポジトリが必要です。

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

それでおしまい。今は全員が同期しているはずです。


1
正解です。ありがとう!
キロール2018年

多くの時間を節約しました。ありがとう!
an0nh4x0r

9

githubにレポをフォークするのを忘れて、間違いに気付く前にいくつかのコミットを追加するという同様の問題がありました。

私はかなり単純な解決策を見つけました。

最初に、元のリポジトリへのリモートを削除します

git remote remove origin

2番目に、githubの新しいフォークにリモートを追加します

git remote add origin <my repo URL>

その後、オリジンマスターにプッシュすると、すべてのコミットがgithubに表示されました。


1
これに追加するために、私がプッシュしたとき、私はしなければなりませんでしたがgit push --set-upstream origin master、Gitはこれをあなたに知らせます。
MRichards

素晴らしくて簡単なソリューション!
エコグラフ

3
  • 宛先Git = UrlD(既存のコンテンツは関係ありません)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

これで、宛先はソースと同じデータになります(origin2の代わりにoriginを使用することもできます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.