先週、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
この答えの残りは、ライセンスを以前のレポに追加したい場合です。
はい。リベースにより、ライセンスコミットを最初のコミットとして配置できます。
リベースは、すべてのコミット作成者とコミット日付をそのままにして、コミット順序を再配置するgitの方法です。
共有リポジトリで作業する場合、チーム全体がgit-fluentである場合を除き、通常は推奨されません。そうでない場合は、リポジトリの新しいコピーを複製するだけです。
最初のコミットとしてLICENSEコミットを取得する方法は次のとおりです。
プロジェクトをチェックアウトし、LICENSEファイルを現在の3つのコミットスタックのトップのコミットに配置します。
#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'
次に、マスターブランチでインタラクティブなリベースを行い、再配置コミットします。
git rebase -i --root
エディターが開きます。一番下の行(「最初のコミット」コミット、最新のコミット)をファイルの先頭に移動します。次に、エディターを保存して終了します。
エディターを終了すると、gitは指定した順序でコミットを書き込みます。
これで、リポジトリのローカルコピーが更新されました。行う:
git log
検証します。
コピーが更新されたので、強制的にgithubにプッシュする必要があります。
git Push -f Origin master
これにより、githubにmasterブランチを新しい場所に移動するよう指示されます。このようなまれなケースでのみプッシュを強制する必要があります。この場合、Pushで作業しているすべての人が保留中の変更を認識します。
最後に、すべての共同編集者はこのリポジトリと同期する必要があります。
最初のクリーンなリポジトリが必要保存されていない変更がある場合、次のコマンドは破壊的になる可能性があるため。
# 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
それでおしまい。全員が同期しているはずです。
同様の問題があり、githubにレポをフォークするのを忘れ、ミスに気付く前にいくつかのコミットを追加しました。
かなり簡単な解決策を見つけました。
最初に元のリポジトリへのリモートを削除します
git remote remove Origin
次に、githubの新しいフォークにリモートを追加します
git remote add Origin <my repo URL>
次に、Originマスターにプッシュすると、コミットがすべてgithubに表示されました。
SourceGit = UrlS
git clone UrlS
git remote add Origin2 UrlD
git Push -f Origin2 master
これで、宛先はソースと同じデータになります(Origin2の代わりにOriginを使用することもできます)