このgitリポジトリに新しい「ルート」ブランチを定義したいと思います。「ルート」ブランチとは、リポジトリ内の他のすべてのブランチから完全に独立しているブランチを意味します1。
残念ながら、A
リポジトリのコミットツリーの最下部にあるコミット(これをと呼びましょう)にも多くのファイルが含まれています(これは、かなり成熟したプロジェクトで初期化されたリポジトリでした)。
これは、私がA
新しいブランチとして指定したとしても<start-point>
、この新しいブランチは「白紙の状態」から始まるのではなく、でコミットされたすべてのファイルが含まれることを意味しますA
。
このリポジトリにできる限り<start-point>
近い状態で完全に裸のブランチを作成する方法はありますA
か?
1ところで、これは新しいリポジトリを作成することと同じではありません。別々のリポジトリは、多くの理由で便利ではありません。
編集:OK、これはvcsjonesの答えに基づいて私がしたことです:
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
この手順は少し複雑ですが、最終結果は空のベースコミットであり<start-point>
、新しい「白紙の状態のブランチ」のとして機能できます。そのとき私がしなければならないのは、
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
将来的には、常に次のような新しいリポジトリを作成します。
git init
git commit --allow-empty -m 'base commit (empty)'
...したがって、最初のコミットは空であり、新しい独立したブランチを開始するために常に使用できます。(これは、ごくまれに必要な機能ですが、すぐに利用できるようにするのは非常に簡単です。)
git rebase --onto
、見stackoverflow.com/questions/645450/...