web-dev-qa-db-ja.com

あるGitリポジトリから別のGitリポジトリにコミットをコピーする方法は?

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

レポジトリを削除してから同じ名前で再度作成し、今回はレポジトリを作成するときにライセンスを選択するかどうか、3人の貢献者に問題がないか尋ねました。

質問

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

53
Jasmine Lognnes

新しいリポジトリにコミットを取得する方法はありますか(今回は最初のコミットは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

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

はい。リベースにより、ライセンスコミットを最初のコミットとして配置できます。

リベースは、すべてのコミット作成者とコミット日付をそのままにして、コミット順序を再配置するgitの方法です。

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

最初のコミットとしてLICENSEコミットを取得する方法は次のとおりです。

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

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

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

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

git rebase -i --root

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

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

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

git log

検証します。

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

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

git Push -f Origin master

これにより、githubにmasterブランチを新しい場所に移動するよう指示されます。このようなまれなケースでのみプッシュを強制する必要があります。この場合、Pushで作業しているすべての人が保留中の変更を認識します。

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

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

79
Moocowmoo

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

かなり簡単な解決策を見つけました。

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

git remote remove Origin

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

git remote add Origin <my repo URL>

次に、Originマスターにプッシュすると、コミットがすべてgithubに表示されました。

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

    git clone UrlS
    
    git remote add Origin2 UrlD
    
    git Push -f Origin2 master
    

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

3
Blue Clouds