Создать сиротскую ветку без использования сиротского флага
У меня есть репо с некоторыми ветками. Я хочу создать новую ветку без истории в этом репо. Я пытаюсь сделать это с помощью Dulwich, который поддерживает большинство операций git, но не флаг-сироту.
Каковы эквивалентные операции Git для создания сиротской ветви без фактического использования этого флага? В идеале я хотел бы:
- клонировать репо
- сделать новую ветку с содержимым репо, но без истории
- подтолкнуть ветку к репо
Это возможно, или мне нужно создать новую пустую ветку, клонировать в отдельный каталог и скопировать обратно содержимое?
1 ответ
Примечание: я не использую Далвич и не могу точно сказать об этом. В зависимости от того, сколько Git он реализует с нуля, то, что делает Git, может быть неактуальным.
Ветвь-сирота в Git - это ветка, которой не существует. Какие git checkout --orphan newbranch
делает, чтобы написать имя newbranch
в HEAD
без создания newbranch
,
Более конкретно, кроме проверки согласованности и ошибок,1 разница между:
git checkout -b newbranch
а также:
git checkout --orphan newbranch
является то, что первый работает:
git update-ref refs/heads/newbranch HEAD && \
git symbolic-ref HEAD refs/heads/newbranch
и последний работает:
git symbolic-ref HEAD refs/heads/newbranch
Первый шаг, git update-ref
фактически создает ветку.
Второй шаг, git symbolic-ref
, устанавливает нас, чтобы быть "на" ветви.
Таким образом, сиротская ветвь - это та, в которой мы "находимся", которой не существует.
Фактическое создание ветки происходит позже, когда мы делаем новый коммит. Так что это не git checkout
это создает их; его git commit
! Операция фиксации в основном состоит из:
- превратить текущий индекс в объект дерева (
git write-tree
); - найти родительские идентификаторы для текущего коммита (прочитано
HEAD
и проверьте наличие ожидающих слияний); - собрать оставшиеся метаданные (автор, коммиттер, адреса электронной почты, отметки времени, сообщение журнала);
- создать объект коммита, который имеет информацию из предыдущих шагов;
- записать новый идентификатор хеша через
HEAD
в текущее имя ветви (или непосредственно вHEAD
еслиHEAD
отсоединен).
Шаг 5 - это место, где создается ветка. На шаге 2, если HEAD
называет ветвь, которая не существует, она не добавляет родительский хэш-идентификатор, поэтому у нового коммита нет родителей (предположительно, в настоящее время нет зарегистрированных дополнительных родителей для слияний).
Если Далвич ведет себя так же, как Git, - это вполне возможно, потому что это своеобразное состояние нахождения на несуществующей ветке - это то, как Git запускает пустой репозиторий, и это очевидный способ сделать это - тогда все, что у вас есть сделать, чтобы реализовать то, что вы хотите напрямую, переписать HEAD
информация (однако Dulwich хранит ее), так что она указывает на эту несуществующую ветвь.
1git checkout -b newbranch
также предлагает git checkout -b newbranch startpoint
, Использование другой отправной точки имеет целый ряд побочных эффектов: Git сначала пытается сделать git checkout startpoint
внутренне, что может привести к произвольным изменениям индекса и рабочего дерева.