rsync из репозитория git или архива tar - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть git-репозиторий, и я хочу rsync для конкретной ревизии репозитория в каталог.В основном я хочу сделать это:

$ 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

, потому что это также требует много ненужной работы, особенно если ~ / final-destination является удаленным каталогом.Другим вариантом может быть извлечение конкретной ревизии и rsync непосредственно из хранилища:

$ git checkout $MY_COMMIT
$ rsync -a --exclude .git my-git-repo/ ~/final-destination

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

Итак.Есть ли способ rsync напрямую из определенной ревизии репозитория.Или, в случае неудачи, я могу каким-то образом rsync из архива tar не распаковывать его?

1 Ответ

0 голосов
/ 29 апреля 2011

Если вы не хотите rsync из вашего рабочего дерева, я боюсь, что вы застряли при извлечении во временный каталог. (Хотя, когда я говорю такие вещи о переполнении стека, неизбежно кто-то придумывает что-то более изобретательное:))

Одна вещь, которую вы можете попробовать, это спрятать ваши изменения, получить фиксацию, которую вы хотите, rsync, переключиться обратно на предыдущую ветку и снова выдвинуть шкатулку:

set -e

git stash
git checkout $MY_COMMIT
rsync -a --exclude .git ./ ~/final-destination
git checkout -
git stash pop

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

...