git bundle - не получается осилить
От: IID Россия  
Дата: 05.07.21 16:21
Оценка:

Дано:

bare GIT репозиторий. Пусть, для простоты, без веток.
Есть refs на ключевые коммиты. Для определённости r1, r2, r3, r4, r5

Необходимо:

1) создать bundle для r1, r2, r3.
Который после clone --mirror окажется таким же bare репозиторием, как в исходных условиях, но будет содержать refs r1, r2, r3 => все коммиты только до (включая) r3.

2) создать bundle для r4.
Который можно будет заимпортить в созданный на предыдущем шаге bare репозиторий. И коммиты окажутся уже вплоть до (включая) r4.

3) аналогично п2 для r5.

Бьюсь уже несколько часов.
Одна фигна выходит. То в п.1 репозиторий из бандла не восстанавливается, то refs пропадают, то последующие бандлы не импортятся.
Кто-нибудь, покажите РАБОТАЮЩИЙ порядок действий. Т.е. не надо просто теории, проверьте сначала свою мысль на практике.
kalsarikännit
Re: git bundle - не получается осилить
От: ivdev  
Дата: 05.07.21 18:39
Оценка: -3 :)
Здравствуйте, IID, Вы писали:


IID>

Дано:

IID>bare GIT репозиторий. Пусть, для простоты, без веток.
IID>Есть refs на ключевые коммиты. Для определённости r1, r2, r3, r4, r5

Гит бесил всегда. по теме — обучалок в ютуб до жопы просто (что конечно же говорит о юзабельности этого дерьма )
И да. Тоже живу с этой дрянью где-то с год, но не в состоянии ответить на твой вопрос.
Re: git bundle - не получается осилить
От: halo Украина  
Дата: 05.07.21 21:25
Оценка: 1 (1)
Здравствуйте, IID, Вы писали:

IID>1) создать bundle для r1, r2, r3.

IID>Который после clone --mirror окажется таким же bare репозиторием, как в исходных условиях, но будет содержать refs r1, r2, r3 => все коммиты только до (включая) r3.

A: git bundle create R1-R2-R3.bundle r1 r2 r3
B: git create --mirror R1-R2-R3.bundle B

IID>2) создать bundle для r4.

IID>Который можно будет заимпортить в созданный на предыдущем шаге bare репозиторий. И коммиты окажутся уже вплоть до (включая) r4.

A: git bundle create R4.bundle r3..r4
B: git bundle unbundle R4.bundle && git update-ref "$FULL_r4_REF_NAME" "$r4_COMMIT_OBJECT" # получить из unbundle/list-heads
или
B: git fetch R4.bundle r4:"$LOCAL_REF_NAME"

IID>3) аналогично п2 для r5.


A: git bundle create R5.bundle r4..r5
B: git bundle unbundle R5.bundle && git update-ref "$FULL_r5_REF_NAME" "$r5_COMMIT_OBJECT" # получить из unbundle/list-heads
или
B: git fetch R5.bundle r5:"$LOCAL_REF_NAME"

IID>То в п.1 репозиторий из бандла не восстанавливается, то refs пропадают, то последующие бандлы не импортятся.


https://git-scm.com/docs/git-bundle#Documentation/git-bundle.txt-unbundleltfilegt :

unbundle <file>
Passes the objects in the bundle to git index-pack for storage in the repository, then prints the names of all defined references. If a list of references is given, only references matching those in the list are printed. This command is really plumbing, intended to be called only by git fetch.

Re[2]: git bundle - не получается осилить
От: IID Россия  
Дата: 07.07.21 09:47
Оценка:
Здравствуйте, halo, Вы писали:

H>Здравствуйте, IID, Вы писали:


IID>>1) создать bundle для r1, r2, r3.

IID>>Который после clone --mirror окажется таким же bare репозиторием, как в исходных условиях, но будет содержать refs r1, r2, r3 => все коммиты только до (включая) r3.

H>A: git bundle create R1-R2-R3.bundle r1 r2 r3

H>B: git create --mirror R1-R2-R3.bundle B

B: вместо "create" нужен "clone", правильно ?

Не работает.

Создаётся пустой репозиторий.

fatal: your current branch 'master' does not have any commits yet


"git log" показывает отсутствие коммитов. Внутри bundle виндо только теги.

Дальше проверять бессмысленно
Тестовые скрипты
kalsarikännit
Re[2]: git bundle - не получается осилить
От: IID Россия  
Дата: 07.07.21 10:47
Оценка:
Здравствуйте, halo, Вы писали:

H>A: git bundle create R1-R2-R3.bundle r1 r2 r3


H>>A: git bundle create R1-R2-R3.bundle r1 r2 r3


Попробовал начать с мастера:
git bundle create R1-R2-R3.bundle master r1 r2 r3

Теперь в бандл попали все коммиты.
Что неверно, т.к. коммиты моложе r3 должны были быть проигнорированы.

Зато приустствуют только указанные теги. Это правильно, конечно. Если бы не было лишних коммитов.
kalsarikännit
Re[3]: git bundle - не получается осилить
От: halo Украина  
Дата: 07.07.21 12:31
Оценка: 1 (1)
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, halo, Вы писали:


H>>Здравствуйте, IID, Вы писали:


IID>>>1) создать bundle для r1, r2, r3.

IID>>>Который после clone --mirror окажется таким же bare репозиторием, как в исходных условиях, но будет содержать refs r1, r2, r3 => все коммиты только до (включая) r3.

H>>A: git bundle create R1-R2-R3.bundle r1 r2 r3

H>>B: git create --mirror R1-R2-R3.bundle B

IID>B: вместо "create" нужен "clone", правильно ?


Да, опечатался.

IID>Не работает.


IID>Создаётся пустой репозиторий.


Нет, см. git show-ref.

IID>

IID>fatal: your current branch 'master' does not have any commits yet


IID>"git log" показывает отсутствие коммитов. Внутри bundle виндо только теги.


Потому что master-а нет в бандле, см. git show-ref и update-ref.

IID>Дальше проверять бессмысленно

IID>Тестовые скрипты

Для такого есть git fast-export.
Отредактировано 07.07.2021 12:38 halo . Предыдущая версия .
Re: git bundle - не получается осилить
От: · Великобритания  
Дата: 07.07.21 14:39
Оценка: 3 (1)
Здравствуйте, IID, Вы писали:

IID> Дано:

IID> bare GIT репозиторий. Пусть, для простоты, без веток.
IID> Есть refs на ключевые коммиты. Для определённости r1, r2, r3, r4, r5
По-моему у тебя основная проблема, что ты оперируешь тегами, а не ветками и заблудился в трёх соснахревизиях.

IID> Необходимо:

IID> 1) создать bundle для r1, r2, r3.
IID> Который после clone --mirror окажется таким же bare репозиторием, как в исходных условиях, но будет содержать refs r1, r2, r3 => все коммиты только до (включая) r3.
У тебя команда git clone --mirror r1-r2-r3.bundle $name создаёт репу в которой есть только теги r1,r2,r3, но master ветки там у тебя нет, т.к. ты не включил её при создании бандла.
Иными словами в твоём бандле нет ветки master и поэтому после восстановления её тупо неоткуда взять...

У тебя варианты:
— создавать начальный бандл в момент когда r4 и r5 ещё нет и включать master в него.
— после создания restored-repo вручную там создай ветку явно "git branch master release-3"
— ничего не делать , ну будет у тебя репо без веток, только теги... но не знаю для чего это тебе нужно

IID> 2) создать bundle для r4.

IID> Который можно будет заимпортить в созданный на предыдущем шаге bare репозиторий. И коммиты окажутся уже вплоть до (включая) r4.

Это вроде в доке для bundle описано. Если ты просто сделаешь "git bundle create ../r4-f.bundle release-4" то включатся вся история до r4. Либо ты делаешь закладку и делаешь incremental bundle как в доке git tag -f lastR2bundle ....
#инкрементальный bundle между r3 и r4
repo.git$ git bundle create ../r4.bundle release-3..release-4

# вытягиваем тег из бандла
restored-repo.git$ git fetch ../r4.bundle release-4


нужны ли тебе ветки — неясно. Поэтому ты лучше опиши вначале _задачу_, которую ты пытаешься решить, а мы попробуем подумать как её решить...
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 07.07.2021 14:48 · . Предыдущая версия .
Re[2]: git bundle - не получается осилить
От: · Великобритания  
Дата: 07.07.21 14:53
Оценка: 3 (1)
Здравствуйте, ·, Вы писали:

·>
·># вытягиваем тег из бандла
·>restored-repo.git$ git fetch ../r4.bundle release-4
·>


или проще так, чтобы вытягивать все теги
git fetch ../r4.bundle 'refs/tags/*:refs/tags/*'
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: git bundle - не получается осилить
От: · Великобритания  
Дата: 07.07.21 14:58
Оценка: 3 (1)
Здравствуйте, IID, Вы писали:
IID>Попробовал начать с мастера:
IID>git bundle create R1-R2-R3.bundle master r1 r2 r3

IID>Теперь в бандл попали все коммиты.

IID>Что неверно, т.к. коммиты моложе r3 должны были быть проигнорированы.
Потому что в начальном репозитории ветка master указывает на ревизию r5. Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое?

Хинт: в git ветки/теги это не какая-то магия неясно как работающая, а просто именованный указатель на ревизию.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: git bundle - не получается осилить
От: IID Россия  
Дата: 07.07.21 15:17
Оценка:
Здравствуйте, ·, Вы писали:

·>или проще так, чтобы вытягивать все теги

·>git fetch ../r4.bundle 'refs/tags/*:refs/tags/*'

Причём я уже пользовался такой конструкцией, для [сетевого] обновления клона bare репозитория из родителя.
Но только сейчас весь паззл сошёлся!

Спасибо
kalsarikännit
Re[4]: git bundle - не получается осилить
От: IID Россия  
Дата: 07.07.21 15:21
Оценка:
Здравствуйте, ·, Вы писали:

IID>>Попробовал начать с мастера:

IID>>git bundle create R1-R2-R3.bundle master r1 r2 r3

IID>>Теперь в бандл попали все коммиты.

IID>>Что неверно, т.к. коммиты моложе r3 должны были быть проигнорированы.
·>Потому что в начальном репозитории ветка master указывает на ревизию r5.

Но как теги r4 и r5 попали в бандл, если я их не указывал при создании ?

·>Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое?


Например по её отсутствию выдать ошибку, при попытке просмотреть лог.
А если бы я до создания бандла передвинул HEAD на r3 ?
kalsarikännit
Re[5]: git bundle - не получается осилить
От: · Великобритания  
Дата: 07.07.21 15:35
Оценка: 9 (1)
Здравствуйте, IID, Вы писали:

IID>·>Потому что в начальном репозитории ветка master указывает на ревизию r5.

IID>Но как теги r4 и r5 попали в бандл, если я их не указывал при создании ?
Теги не попали. Попали коммиты, т.к. они находятся в истории ветки master.

IID>·>Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое?

IID>Например по её отсутствию выдать ошибку, при попытке просмотреть лог.
ну у меня оно и выдваёт ошибку, что беда приключилась с веткой master... Ты можешь поглядеть лог конкретного тега, например "git log release-3".

IID>А если бы я до создания бандла передвинул HEAD на r3 ?

Ну эээ.. я не понял что ты хочешь. Бандл вещь тупая как пробка. Это по сути вот такой "текстовый" файлик со всеми рефами (т.е. теги, бранчи) которые ты включил при создании бандла
ref1 -> 2fe9746342a6721a474888cd9a283334aefb56fa
...
refN -> 06a0e10f1aaed1b76fdcb9382ea459e5559254ba

Плюс коммиты в диапазонах, которые ты указал при создании бандла.

Вот и думай что тебе куда надо замапить при создании репы из бандла.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.