Создать сиротскую ветку без использования сиротского флага

У меня есть репо с некоторыми ветками. Я хочу создать новую ветку без истории в этом репо. Я пытаюсь сделать это с помощью 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! Операция фиксации в основном состоит из:

  1. превратить текущий индекс в объект дерева (git write-tree);
  2. найти родительские идентификаторы для текущего коммита (прочитано HEAD и проверьте наличие ожидающих слияний);
  3. собрать оставшиеся метаданные (автор, коммиттер, адреса электронной почты, отметки времени, сообщение журнала);
  4. создать объект коммита, который имеет информацию из предыдущих шагов;
  5. записать новый идентификатор хеша через HEAD в текущее имя ветви (или непосредственно в HEAD если HEAD отсоединен).

Шаг 5 - это место, где создается ветка. На шаге 2, если HEAD называет ветвь, которая не существует, она не добавляет родительский хэш-идентификатор, поэтому у нового коммита нет родителей (предположительно, в настоящее время нет зарегистрированных дополнительных родителей для слияний).

Если Далвич ведет себя так же, как Git, - это вполне возможно, потому что это своеобразное состояние нахождения на несуществующей ветке - это то, как Git запускает пустой репозиторий, и это очевидный способ сделать это - тогда все, что у вас есть сделать, чтобы реализовать то, что вы хотите напрямую, переписать HEAD информация (однако Dulwich хранит ее), так что она указывает на эту несуществующую ветвь.


1git checkout -b newbranch также предлагает git checkout -b newbranch startpoint, Использование другой отправной точки имеет целый ряд побочных эффектов: Git сначала пытается сделать git checkout startpoint внутренне, что может привести к произвольным изменениям индекса и рабочего дерева.

Другие вопросы по тегам