【问题标题】:How do you organise multiple git repositories, so that all of them are backed up together?您如何组织多个 git 存储库,以便将它们全部备份在一起?
【发布时间】:2010-09-07 09:40:04
【问题描述】:

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

现在,我有一堆 git 存储库,用于各种项目,其中一些在 github 上。我也有我提到的 SVN 存储库,通过 git-svn 命令导入..

基本上,我喜欢将我所有的代码(不仅仅是项目,还有随机的 sn-ps 和脚本,一些东西,比如我的简历、我写的文章、我创建的网站等等)放在一个大的存储库中可以轻松克隆到远程机器或记忆棒/硬盘驱动器上作为备份。

问题是,因为它是一个私有存储库,并且 git 不允许签出特定文件夹(我可以将其作为一个单独的项目推送到 github,但更改会同时出现在 master-repo 和子仓库)

可以使用 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 存储库,并保持同步和备份?

【问题讨论】:

    标签: git backup


    【解决方案1】:

    如何使用mr 一次管理多个 Git 存储库:

    mr(1) 命令可以检查、更新或执行其他操作 一组存储库,就好像它们是一个组合存储库一样。它 支持颠覆、git、cvs、mercurial、bzr、 darcs、cvs、vcsh、fossil 和 veracity 存储库,并支持 可以轻松添加其他版本控制系统。 [...]

    它可以通过简单的 shell 脚本进行高度配置。一些例子 它可以做的事情包括:

    [...]

    • 更新 git 存储库时,从两个不同的上游拉取并将两者合并在一起。
    • 并行运行多个存储库更新,大大加快了更新过程。
    • 记住因笔记本电脑脱机而失败的操作,以便在笔记本电脑重新联机时重试。

    【讨论】:

      【解决方案2】:

      我想在他推荐的地方添加到Damien's answer

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

      您可以设置一个特殊的遥控器,用 1 个命令推送到所有单独的真实遥控器;我在http://marc.info/?l=git&m=116231242118202&w=2找到它:

      所以对于“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>
      

      【讨论】:

        【解决方案3】:

        ,我还没有尝试嵌套 git 存储库,因为我还没有遇到我需要的情况。正如我在#git channel 上所读到的,git 似乎对嵌套存储库感到困惑,即您试图在 git 存储库中进行 git-init。管理嵌套 git 结构的唯一方法是使用 git-submodule 或 Android 的 repo 实用程序。

        至于您所描述的备份责任,我说委派它...对我来说,我通常将每个项目的“原始”存储库放在定期备份的工作网络驱动器上由 IT 技术人员选择的备份策略。这很简单,我不必担心。 ;)

        【讨论】:

          【解决方案4】:

          还有另一种嵌套 git repos 的方法,但它并不能解决您要解决的问题。不过,对于正在寻找解决方案的其他人来说,我是:

          在顶级 git repo 中,只需隐藏 .gitignore 中包含嵌套 git repo 的文件夹。这使得拥有两个单独(但嵌套!)的 git repos 变得容易。

          【讨论】:

            【解决方案5】:

            我也对处理此问题的建议方法感到好奇,并将描述我使用的当前设置(使用 SVN)。我基本上已经创建了一个存储库,其中包含一个迷你文件系统层次结构,包括它自己的 bin 和 lib 目录。这棵树的根目录中有一个脚本,它将设置您的环境以将这些 bin、lib 等...其他目录添加到适当的环境变量中。所以根目录本质上是这样的:

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

            现在 /bin 和 /lib 内有多个项目及其对应的库。我知道这不是一个标准项目,但我小组中的其他人很容易签出 repo,运行“setup_env.bash”脚本并在他们的本地拥有所有项目的最新版本退房。他们不必担心安装/更新 /usr/bin 或 /usr/lib 并且每次结帐都可以轻松进行多个结帐和非常本地化的环境。有人也可以只 rm 整个存储库,而不必担心卸载任何程序。

            这对我们来说很好,我不确定我们是否会改变它。这样做的问题是在这个大存储库中有很多项目。是否有 git/Hg/bzr 标准方法来创建这样的环境并将项目分解到自己的存储库中?

            【讨论】:

              【解决方案6】:

              我会强烈建议不要将不相关的数据放在给定的 Git 存储库。创建新存储库的开销相当大 低,这是一个功能,它可以保持 不同的血统完全分开。

              与这种想法作斗争意味着以不必要的纠结历史告终, 这使得管理更加困难,而且——更多 重要的是——“考古”工具不太有用,因为结果 稀释。此外,正如您所提到的,Git 假设“单位 克隆”是存储库,实际上必须这样做是因为 它的分布式特性。

              一种解决方案是保留每个项目/包/等。作为它自己的 在受祝福的层次结构下的存储库(即,没有工作树), 喜欢:

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

              一旦建立了一些约定,就变得微不足道了 将管理操作(备份、打包、网络发布)应用于 完整的层次结构,其作用与 “单片” SVN 存储库。还使用这些存储库 变得有点类似于 SVN 工作流程,除了一个 可以使用本地提交和分支:

              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 ...
              

              然后您可以从每个“来源”中获取/拉取,工作并提交 本地,然后推送(“备份”)到这些遥控器中的每一个,当你 准备好类似的东西(注意如何推动 same 提交 和每个遥控器的历史!):

              $ 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--但不会抛出 现有的“本地”历史。

              注意:子模块是一种包含共享相关的机制 血统,所以我确实不认为它们是合适的工具 您要解决的问题。

              【讨论】:

              • 事实上,我不断地拥有许多独立的存储库并编写简单的脚本来帮助管理它们,这让我觉得 git 中缺少一些东西。我只是不能确切地决定它是什么或如何处理它。
              • 嗯,你也管理很多单独的项目吗?在分布式世界中,项目和存储库之间的一对一关系是合理的,但我仍然会将裸存储库安排在一个公共目录树中,以便于备份和管理。 (换句话说,Git/Hg/Bzr 迫使您将管理与项目任务分开,而大多数 SVN 工作流程将两者混为一谈;现在人们将管理部分委托给 GitHub 或其他此类提供商很常见。)
              • 这个想法只有在你托管自己的项目和/或它们都是开源的时候才有意义。否则,您将需要在 github 上需要无限的私人项目,这可能会变得昂贵
              • 除了“for remote in origin github memorystick;do git push $remote; done”,还可以配置一个特殊的遥控器,用一个命令推送到多个遥控器:stackoverflow.com/questions/36862/…。 (在某些情况下可能更方便。)
              • 我认为缺少的东西是 git 可以通过子树将其对象分开的一种方式,以便单个“存储库”可以由单独的同步但可分离的单元(单独下载而没有其余部分)组成一种人们可以在不知道其余部分的情况下处理特定子集的方式。
              猜你喜欢
              • 1970-01-01
              • 2018-04-01
              • 2011-03-18
              • 2016-03-12
              • 1970-01-01
              • 2011-11-26
              • 2011-01-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多