rsync从git存储库或tar存档

时间:2011-04-29 05:12:52

标签: git tar rsync

我有一个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

这个问题是需要提取到临时目录并从中进行rsyncing。这(理论上)是不必要的,并且使用庞大的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。或者失败,我可以以某种方式从tar存档rsync而不必提取它?

1 个答案:

答案 0 :(得分:0)

如果您不希望rsync退出工作树,我担心您会先被提取到临时目录。 (虽然当我在Stack Overflow上说那种事情时,不可避免地会有人想出一些更巧妙的东西:))

您可以尝试的一件事是存储您的更改,检查您想要的提交,rsync,切换回上一个分支,然后再次弹出存储:

set -e

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

(我没有测试过,我应该警告你。)