rsync из репозитория git или архива tar

#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
  

(Я не тестировал это, должен вас предупредить.)