你如何组织多个git仓库,这样所有的仓库都一起备份?

使用SVN,我有一个单独的大型存储库,我保存在服务器上,并在几台机器上检出。 这是一个非常好的备份系统,可以让我轻松地在任何机器上工作。 我可以签出一个特定的项目,提交并更新了“主”项目,或者我可以检查整个事情。

现在,我有一堆git仓库,为各种项目,其中几个在github上。 我也有我提到的SVN库,通过git-svn命令导入..

基本上,我喜欢把所有的代码(不只是项目,而是随机的片段和脚本,像我的简历,我写的文章,我做的网站等等)机器或记忆棒/硬盘作为备份。

问题是,因为它是一个私人存储库,并且git不允许检出一个特定的文件夹(我可以推送到github作为一个单独的项目,但是在master-repo和sub-回购)

可以使用git子模块系统,但是它并没有满足我的需求(子模块是指向其他存储库的指针,并且不包含实际的代码,所以对于备份是没有用的)

目前我有一个git-repos文件夹(例如,〜/ code_projects / proj1 / .git /〜/ code_projects / proj2 / .git /),做了proj1的更改之后,我做了git push github ,到〜/ Documents / code / python / projects / proj1 /中,然后进行一次提交(而不是单个回购中的众多提交)。 然后做git push backupdrive1git push mymemorystick git push backupdrive1

所以,问题是:你的个人代码和项目如何与git仓库保持同步和备份?

强烈build议不要将无关的数据放在给定的Git存储库中。 创build新存储库的开销非常低,这是一个可以使不同谱系完全分离的function。

对抗这个想法意味着结束不必要的纠结的历史,这使得行政pipe理变得更加困难,更重要的是由于稀释造成的“考古”工具的用处不大。 另外,正如你所提到的,Git假定“克隆单位”是存储库,实际上由于它的分布性而必须这样做。

一个解决scheme是保持每个项目/包/等。 作为自己的仓库(即没有工作树)在一个幸运的层次结构,如:

 /repos/a.git /repos/b.git /repos/c.git 

一旦build立了一些约定,将pipe理操作(备份,打包,networking发布)应用于完整的层次结构就变得微不足道了,这种function与“单一的”SVN库不完全不同。 使用这些存储库也变得有些类似于SVN工作stream,另外可以使用本地提交和分支:

 svn checkout --> git clone svn update --> git pull svn commit --> git push 

您可以在每个工作克隆中使用多个远程,以便于多方之间的同步:

 $ cd ~/dev $ git clone /repos/foo.git # or the one from github, ... $ cd foo $ git remote add github ... $ git remote add memorystick ... 

然后,您可以从每个“源”获取/拉取,在本地工作并提交,然后在准备好类似的东西时将(“备份”)推送到每个远程(注意如何将相同的提交和历史logging每个遥控!):

 $ for remote in origin github memorystick; do git push $remote; done 

将一个现有的正在运行的仓库~/dev/foo变成一个裸仓库最简单的方法可能是:

 $ cd ~/dev $ git clone --bare foo /repos/foo.git $ mv foo foo.old $ git clone /repos/foo.git 

这相当于一个svn import – 但不会抛弃现有的“本地”历史。

注意: 子模块是一种包含共享相关谱系的机制,所以我确实不会认为它们是您正在尝试解决的问题的适当工具。

我想补充Damien的回答 ,他build议:

 $ for remote in origin github memorystick; do git push $remote; done 

你可以设置一个特殊的遥控器,用一个命令推送到所有的个人遥控器。 我在http://marc.info/?l=git&m=116231242118202&w=2find它:;

所以对于“git push”(多次推送相同的分支是有意义的),你实际上可以做我所做的事情:

  • .git / config包含:

     [remote "all"] url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 url = login.osdl.org:linux-2.6.git 
  • 现在git push all master会将“master”分支推向两者
    这些远程仓库。

您也可以通过使用结构来保存自己的url两次:

 [url "<actual url base>"] insteadOf = <other url base> 

,我还没有尝试嵌套的Git仓库,因为我没有遇到一个我需要的情况。 正如我在#git通道读到的,git好像被嵌套存储库弄糊涂了,也就是说你试图在git仓库里面使用git-init。 pipe理嵌套git结构的唯一方法是使用git-submodule或Android的repo实用程序。

至于你所描述的备份责任,我说委托它…对我来说,我通常把每个项目的“原始”存储库在一个networking驱动器工作,由IT技术定期备份的备份策略select。 这很简单,我不必担心。 ;)

我也很好奇build议的方式来处理这个问题,并会描述我使用的当前设置(使用SVN)。 我已经基本上创build了一个存储库,其中包含一个迷你文件系统层次结构,包括它自己的bin和lib目录。 在这棵树的根上有一个脚本,它将设置你的环境来将这些bin,lib等等其他的dirs添加到正确的环境variables中。 所以根目录看起来像这样:

 ./bin/ # prepended to $PATH ./lib/ # prepended to $LD_LIBRARY_PATH ./lib/python/ # prepended to $PYTHONPATH ./setup_env.bash # sets up the environment 

现在在/ bin和/ lib里面有多个项目和它们相应的库。 我知道这不是一个标准项目,但是对于我的团队中的其他人来说,签出回购很容易,运行“setup_env.bash”脚本,并且拥有本地所有项目的最新版本查看。 他们不必担心安装/更新/ usr / bin或/ usr / lib,并且可以简化多次签出和每次签出非常本地化的环境。 有人也可以只是rm整个存储库,不用担心卸载任何程序。

这对我们来说工作得很好,我不确定我们是否会改变它。 这个问题在于这个大型仓库中有很多项目。 有没有一个git / Hg / bzr标准的方式来创build这样的环境,并将项目分解到他们自己的仓库?

怎么样一起使用mr来pipe理你的多个Git仓库:

mr(1)命令可以对一组存储库进行签出,更新或执行其他操作,就像它们是一个组合的存储库一样。 它支持Subversion,git,cvs,mercurial,bzr,darcs,cvs,vcsh,化石和准确性库的任意组合,并且可以轻松地添加对其他版本控制系统的支持。 […]

它通过简单的shell脚本极其可configuration。 它可以做的一些事例包括:

[…]

  • 当更新一个git仓库时,从两个不同的上游拉,并将两者合并在一起。
  • 并行运行多个存储库更新,大大加快了更新过程。
  • 请记住由于笔记本电脑处于脱机状态而导致失败的操作,因此在重新联机时可以重试。

还有另外一种嵌套的git仓库的方法,但是它不能解决你之后的问题。 不过,对于正在寻找解决scheme的其他人来说,

在最顶层的git仓库中,只需隐藏包含嵌套git仓库的.gitignore中的文件夹即可。 这使得有两个单独的(但是嵌套!)git仓库很容易。