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 пропадают, то последующие бандлы не импортятся.
Кто-нибудь, покажите РАБОТАЮЩИЙ порядок действий. Т.е. не надо просто теории, проверьте сначала свою мысль на практике.
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.
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 пропадают, то последующие бандлы не импортятся.
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.
Здравствуйте, 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 виндо только теги.
Здравствуйте, 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>Тестовые скрипты
Здравствуйте, 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
нужны ли тебе ветки — неясно. Поэтому ты лучше опиши вначале _задачу_, которую ты пытаешься решить, а мы попробуем подумать как её решить...
Здравствуйте, IID, Вы писали: IID>Попробовал начать с мастера: IID>git bundle create R1-R2-R3.bundle master r1 r2 r3
IID>Теперь в бандл попали все коммиты. IID>Что неверно, т.к. коммиты моложе r3 должны были быть проигнорированы.
Потому что в начальном репозитории ветка master указывает на ревизию r5. Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое?
Хинт: в git ветки/теги это не какая-то магия неясно как работающая, а просто именованный указатель на ревизию.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
IID>>Попробовал начать с мастера: IID>>git bundle create R1-R2-R3.bundle master r1 r2 r3
IID>>Теперь в бандл попали все коммиты. IID>>Что неверно, т.к. коммиты моложе r3 должны были быть проигнорированы. ·>Потому что в начальном репозитории ветка master указывает на ревизию r5.
Но как теги r4 и r5 попали в бандл, если я их не указывал при создании ?
·>Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое?
Например по её отсутствию выдать ошибку, при попытке просмотреть лог.
А если бы я до создания бандла передвинул HEAD на r3 ?
Здравствуйте, IID, Вы писали:
IID>·>Потому что в начальном репозитории ветка master указывает на ревизию r5. IID>Но как теги r4 и r5 попали в бандл, если я их не указывал при создании ?
Теги не попали. Попали коммиты, т.к. они находятся в истории ветки master.
IID>·>Каким образом git может догадаться, что в restored репозитории эта ветка должна указывать на что-то другое? IID>Например по её отсутствию выдать ошибку, при попытке просмотреть лог.
ну у меня оно и выдваёт ошибку, что беда приключилась с веткой master... Ты можешь поглядеть лог конкретного тега, например "git log release-3".
IID>А если бы я до создания бандла передвинул HEAD на r3 ?
Ну эээ.. я не понял что ты хочешь. Бандл вещь тупая как пробка. Это по сути вот такой "текстовый" файлик со всеми рефами (т.е. теги, бранчи) которые ты включил при создании бандла