使用git存储库或tar归档的rsync

问题描述:

我有一个git存储库,我想将某个特定的版本库修改为一个目录。基本上我想这样做:使用git存储库或tar归档的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仓库需要很长时间,并且需要大量的可用空间。我不只是想直接清除〜/最后目的地和焦油到它:

$ git archive $MY_COMMIT | tar x -C ~/final-destination 

,因为这还需要大量的不必要的工作,尤其是在〜/最后目的地是远程目录。另一种选择是直接从版本库中签出特定的版本和rsync:

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

但我宁愿不要惹惹版本库的工作目录。我想在一个可能在后台运行的脚本中执行所有这些操作,而我正在执行存储库中的任务。

所以。有没有一种方法可以直接从版本库的特定版本中进行rsync。或失败,我可以以某种方式从tar归档rsync,而不必提取它?

+0

你试过'混帐推/ pull'或'git的格式补丁/ am'(在这种情况下,远端应该也是git repo)? – jfs 2011-04-29 07:30:42

如果你不想rsync你的工作树的,我怕你坚持解压到一个临时目录第一。 (虽然当我说的那种对堆栈溢出的东西,难免有人想出了更多的东西巧妙的:))

有一两件事你可以尝试是藏匿更改,签出你想要的承诺,rsync的,切换回以前的分支然后再弹出的藏匿处:

set -e 

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

(我没有测试过,我要提醒你。)