#git #tar #rsync
#git #tar #rsync
Вопрос:
У меня есть репозиторий git, и я хочу повторно синхронизировать определенную ревизию репозитория в каталог. В принципе, я хочу сделать это:
$ cd my-git-repo
$ git archive $MY_COMMIT > ~/blah.tar.gz
$ mkdir ~/tmp
$ cd ~/tmp
$ tar xf ~/blah.tar.gz
$ rsync -a ~/tmp/ ~/final-destination
$ cd
$ rm -r tmp
Проблема в том, что для этого требуется извлечение во временный каталог и повторная синхронизация из него. В этом (теоретически) нет необходимости, а при огромном репозитории git это занимает много времени и требует много свободного места. Я не просто хочу очистить ~/ final-destination и tar непосредственно в него с:
$ git archive $MY_COMMIT | tar x -C ~/final-destination
потому что это также требует много ненужной работы, особенно если ~/ конечный пункт назначения является удаленным каталогом. Другим вариантом было бы извлечь конкретную ревизию и выполнить rsync непосредственно из репозитория:
$ git checkout $MY_COMMIT
$ rsync -a --exclude .git my-git-repo/ ~/final-destination
но я бы предпочел не связываться с рабочим каталогом репозитория. Я хочу сделать все это в скрипте, который может выполняться в фоновом режиме, пока я занимаюсь чем-то в репозитории.
Итак. Есть ли способ rsync непосредственно из определенной версии репозитория. Или, в противном случае, могу ли я каким-либо образом выполнить rsync из архива tar без необходимости его извлечения?
Комментарии:
1. вы пробовали
git push/pull
илиgit format-patch/am
(в этом случае удаленный конец тоже должен быть репозиторием git)?
Ответ №1:
Если вы не хотите rsync
выходить из своего рабочего дерева, боюсь, вам придется сначала выполнить извлечение во временный каталог. (Хотя, когда я говорю подобные вещи о переполнении стека, неизбежно кто-то придумывает что-то более оригинальное :))
Единственное, что вы могли бы попробовать, это сохранить свои изменения, выполнить проверку нужного коммита, rsync, переключиться обратно на предыдущую ветку, а затем снова открыть тайник:
set -e
git stash
git checkout $MY_COMMIT
rsync -a --exclude .git ./ ~/final-destination
git checkout -
git stash pop
(Я не тестировал это, должен вас предупредить.)