Создать архив git из репо без коммита - PullRequest
1 голос
/ 04 мая 2019

Есть команда git archive - есть ли способ создать тарбол из репо без совершения коммита?По сути, я просто хочу создать tarball из существующих файлов (что более важно в честь gitignore).Я предполагаю, что git archive ищет коммит - но я просто хочу сделать снимок кода даже для незафиксированных изменений.

Еще один способ сделать это - написать программу, которая изменит все файлы и проигнорируетчто в gitignore, но для этого нужно написать эту программу.

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

Простой и легкий и, очевидно, правильный способ сделать это: просто сделать коммит (как bk2204 предлагает ).

Но, поскольку git archive занимает <tree-ish>, вы можете сделать это без выполнения коммита. Просто сделайте дерево частью коммита, что составляет половину (или больше) фактического коммита, и затем используйте это:

git archive [additional options] $(git write-tree)

Проблема здесь в том, что git write-tree сейчас напишет все, что находится в index . Это означает, что вам нужно добавить все обновленные файлы в индекс, даже если вы не собираетесь делать коммит. Вы можете сделать это с помощью временного индекса, если вы хотите получить дополнительную фантазию, но сначала просто набрать add -u:

git add -u
git archive [additional options] $(git write-tree)

Еще один способ получить файлы рабочего дерева в коммит, не делая коммит самостоятельно, - это использовать git stash для выполнения работы. Это запишет текущее рабочее дерево в новый коммит. Следовательно:

git stash push
git archive [additional options] refs/stash
git stash pop --index

сделает работу более или менее. less происходит, когда нечего копить, в этом случае git stash push ничего не делает, и вы не должны запускать git stash pop. В этом конкретном случае вы можете заархивировать HEAD - но это раздражает, если git stash push что-то сделал. Вы можете добавить больше слоев сценариев, чтобы справиться с этим, но на самом деле, что плохого в том, чтобы просто фиксировать сейчас?

2 голосов
/ 04 мая 2019

git archive требует использования дерева, что означает, что вам нужно дерево, коммит или тег.Ничто не мешает вам создать временную ветку и сделать коммит с нужным вам содержимым и заархивировать его.

В качестве альтернативы, если вы уверены, что вам не нужны проигнорированные файлы, вы можете запустить git clean -dffxа затем используйте tar --exclude-vcs для упаковки вашего архива.Вы также можете пропустить вызов git clean и попробовать tar --exclude-vcs --exclude-vcs-ignores.

1 голос
/ 04 мая 2019

Помимо создания коммита, рассмотрим git bundle: это похоже на git archive ... но с историей.

Вы получаете один файл(пакетный файл), который вы можете скопировать вокруг, а затем клон обратно из.
Подробнее см. " Полное резервное копирование git-репо? ".

...