1. ホーム
  2. linux

[解決済み] ある Git リポジトリから別のリポジトリにコミットをコピーするには?

2022-05-03 10:26:15

質問

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

3人の貢献者に、レポを削除してから同じ名前で再度作成し、今度はレポ作成時にライセンスを選択してもよいか尋ねると、彼らはそれでいいと言いました。

質問事項

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

どのように解決するのですか?

<ブロッククオート

新しいレポにコミットして(今回は最初のコミットが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を追加したい場合です。

はい、LICENSEコミットを最初のコミットとして配置することができます。

リベースとは、コミット作者とコミット日時をすべて維持したままコミット順を並べ替えるギッツ流の方法です。

共有レポで作業する場合、チーム全員がgitに精通していない限り、一般的には推奨されません。そうでない人は、リポジトリの新しいコピーをクローンすればいいのです。

最初のコミットとしてLICENSEコミットを取得する方法を説明します。

1. ローカルコピーの更新とリベース

プロジェクトをチェックアウトし、LICENSE ファイルを現在の 3 つのコミットスタックの一番上にコミットしてください。

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

その後、master ブランチ上で対話的にリベースを行い REARRANGE のコミットです。

git rebase -i --root

エディタが立ち上がります。 一番下の行(あなたの "Initial commit" 直近のコミット)をファイルの一番上に移動してください。その後、保存してエディタを終了します。

エディタを終了すると同時に、git は先ほど指定した順番でコミットを書き込んでいきます。

これでリポジトリのローカルコピーが更新されました。 を実行します。

git log

をクリックして確認します。

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

コピーが更新されたので、それを github に強制的にプッシュします。

git push -f origin master

これは、github に master ブランチを新しい場所に移動するよう指示します。 強制的にプッシュするのは、このように作業している全員が保留中の変更に気づいているような稀なケースに限ります。

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

これで終わりです。 これでみんな同期しているはずです。