Как создать новую (и пустую!) "Корневую" ветвь?

Я хотел бы определить новую ветвь "root" в этом репозитории git. Под "корневой" ветвью я подразумеваю ветвь, полностью независимую от всех остальных ветвей в репозитории 1.

К сожалению, даже фиксация (пусть ее называют A) в самой базе дерева репо commit содержит много файлов (это был репозиторий, который был инициализирован на уже довольно зрелом проекте).

Это означает, что даже если я дал A как новую ветвь <start-point>, эта новая ветвь не начиналась бы с "чистого слайда", а скорее содержала бы все файлы, которые были зафиксированы в A.

Можно ли создать в этом репозитории полностью голую ветвь с <start-point> как можно ближе к A?


1 BTW, это не эквивалентно созданию нового репо. Отдельные репозитории были бы менее удобны по многим причинам.


EDIT: ОК, это то, что я сделал, на основе 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 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)'

... так что первая фиксация пусто и всегда доступна для запуска новой независимой ветки. (Это было бы, я знаю, очень редко требуемое средство, но это довольно легко сделать его доступным.)

Ответ 1

Используйте --orphan при создании ветки:

git checkout --orphan YourBranchName

Это создаст новую ветку с нулевыми фиксациями на ней, но все ваши файлы будут поставлены. В этот момент вы можете просто удалить их.
( "удалить их": A git reset --hard будет пустым индексом, оставив вас с пустым рабочим деревом)

Взгляните на страницу man для получения дополнительной информации о --orphan.

Ответ 2

Чтобы добавить к принятому ответу - передовая практика, чтобы вернуться к чистому состоянию, нужно создать начальная пустая фиксация, поэтому вы можете легко переустановить, настраивая свои ветки для потомков. Плюс, так как вы хотите чистое состояние, вы, вероятно, имеете файлы, которые вам не нужны, поэтому вам нужно удалить их из индекса. Имея это в виду, вы должны:

$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit