git bundle спрятанный код

У меня есть определенный набор кода, спрятанный в git, и я хотел бы связать его, чтобы перенести его в другой клон на отдельном ПК, но я не выяснил, как ссылаться на stash в команде bundle.

stash@{0}: On issue/789: Something I do not want bundled
stash@{1}: WIP on issue/456: Something I do want bundled
stash@{2}: On issue/123: Something else I do not want bundled

Я пытался:

git bundle create My-WIP.bundle stash@{1}

но получите следующую ошибку:

error: Refusing to create empty bundle.

Я могу подтвердить, что тайник @{1} не пуст. Команда bundle не поддерживает тайник? Можно ли сделать то, что я пытаюсь сделать?

1 ответ

Решение

Во-первых, небольшое замечание: каждый тайник на самом деле является просто набором коммитов в определенном формате ( "шкатулка"), которого нет ни в одной ветви. (Здесь проще всего, вероятно, преобразовать тайник в ветку, что значительно упрощает процесс. git stash branch раздел этого ответа для деталей.)

Команда bundle не поддерживает тайник?

Это правильно: это не так, по крайней мере, не так, как вы пытаетесь его использовать. Но это легко (иш) исправить.

Как отмечено в git bundle документация, <git-rev-list-args> Аргументы это:

Список аргументов, приемлемых для git rev-parse и git rev-listсодержащий именованный ref, см. УКАЗАТЕЛЬНЫЕ ССЫЛКИ ниже)

(жирный шрифт). Раздел, на который они ссылаются, продолжает:

git bundle будет упаковывать только те ссылки, которые показаны git show-ref: сюда входят заголовки, теги и удаленные заголовки. Ссылки, такие как master~1 не может быть упаковано...

Хотя их пример использует master~1 все, что не является реальным ссылочным именем, попадает в тупик этой проблемы, включая ссылки reflog, такие как stash@{1},

Тогда решение, если вы действительно хотите сделать это, состоит в том, чтобы присвоить хэш-идентификатору правильное ссылочное имя, такое как имя ветви или тега. Давайте использовать имя тега здесь:

git tag temp-tag stash@{1}

Теперь у вас есть тег, и вы можете создать пакет (или, проще, просто нажать или извлечь тег по сети, чтобы вам не нужно было вычислять соответствующую базу или набор баз). Чтобы избежать создания огромного пакета, вы можете дать подходящую базу в качестве точки остановки, например:

git bundle create foo.bundle temp-tag ^master

(при условии, ^master является подходящей точкой остановки).

Теперь вы можете удалить тег локально:

git tag -d temp-tag

и передать пакет и запустить git fetch на нем в другой системе, чтобы создать тег там. (Или опять вместо того, чтобы возиться с git bundle просто выберите или нажмите метку, используя сетевой протокол, такой как git:// или же ssh:// между двумя компьютерами или сервером.)

Теперь у вас есть тег, temp-tag работает как заначка Регулярный git stash Команды работают нормально, если задан этот тег:

git stash apply temp-tag

например. Удаление тега удаляет имя для этого набора коммитов.

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