先週、Githubリポジトリを作成しましたが、リポジトリのライセンスを選択するのを忘れていました。現在、すでに3つの大きなコミットがあります。
私は3人のコントリビューターに大丈夫かどうか、リポジトリを削除してから同じ名前でもう一度作成するかどうかを尋ねましたが、今回はリポジトリの作成時にライセンスを選択しました。
質問
コミットを新しいリポジトリ(今回は最初のコミットはLICENSEファイルです)に入れ、それでもコミットメタ情報を保持する方法はありますか?
先週、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コミットを最初のコミットとしてリベースすることができます。
リベースは、すべてのコミットの作成者とコミット日付をそのままに保ちながら、gitのコミット順を並べ替える方法です。
共有レポで作業する場合、チーム全体がgit-fluentでない限り、通常は推奨されません。そうでない場合は、リポジトリの新しいコピーを複製するだけです。
ここでは、最初のコミットとしてLICENSEコミットを取得する方法を示します。
プロジェクトをチェックアウトし、現在の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
検証します。
コピーが更新されたので、githubに強制的にプッシュする必要があります。
git push -f origin master
これにより、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
それでおしまい。今は全員が同期しているはずです。
githubにレポをフォークするのを忘れて、間違いに気付く前にいくつかのコミットを追加するという同様の問題がありました。
私はかなり単純な解決策を見つけました。
最初に、元のリポジトリへのリモートを削除します
git remote remove origin
2番目に、githubの新しいフォークにリモートを追加します
git remote add origin <my repo URL>
その後、オリジンマスターにプッシュすると、すべてのコミットがgithubに表示されました。
git push --set-upstream origin master
、Gitはこれをあなたに知らせます。