我们如何组织多个git存储库,以便将它们全部一起备份?

时间:2020-03-05 18:45:39  来源:igfitidea点击:

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

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

基本上,我喜欢将我的所有代码(不仅是项目,还包括随机的代码片段和脚本,诸如我的简历,我写的文章,我创建的网站等等)都可以存放在一个大型存储库中,可以轻松地将其克隆到远程机器或者记忆棒/硬盘驱动器作为备份。

问题是,由于它是一个私有存储库,而git不允许检出特定文件夹(我可以将pu作为单独的项目推送到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存储库,并使它们保持同步和备份?

解决方案

回答

,我还没有尝试嵌套git存储库,因为我还没有遇到过需要的情况。正如我在#git通道上阅读的那样,git似乎由于嵌套存储库而感到困惑,即我们正在尝试在git存储库中进行git-init。管理嵌套git结构的唯一方法是使用git-submodule或者Android的repo实用程序。

至于我们要描述的备份责任,我要说是委派……对我来说,我通常将每个项目的"原始"存储库放在工作的网络驱动器上,并由IT技术人员根据其备份策略定期进行备份。选择。这很简单,我不必担心。 ;)

回答

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

与这个想法作斗争意味着结束不必要的纠结的历史,
这使管理变得更加困难,而且-
重要的是,由于
稀释。另外,正如我们提到的,Git假设"
克隆"是存储库,实际上由于
它的分布式性质。

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

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

一旦建立了一些约定,它就变得微不足道了
将管理操作(备份,打包,Web发布)应用于
完整的层次结构,其作用与
"整体" 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 ...

然后,我们可以从每个"源"中获取/拉取,工作并提交
本地,然后在我们按下("备份")到每个遥控器
准备好类似的东西(注意如何推送相同的提交
和每个遥控器的历史记录!):

$ 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-但不会抛出
现有的"本地"历史消失了。

注意:子模块是一种包含共享相关内容的机制
世系,所以我确实不会认为它们是用于
我们要解决的问题。

回答

我想在他建议的地方添加达米恩的答案:

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

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

So for "git push" (where it makes
  sense to push the same branches
  multiple  times), you can actually do
  what I do:
  
  
  .git/config contains:

[remote "all"]
url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
url = login.osdl.org:linux-2.6.git

  and now git push all master will push the "master" branch to both

  of those remote repositories.

我们还可以使用以下结构来节省两次输入URL的麻烦:

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

回答

我也对处理此问题的建议方法感到好奇,并将描述我使用的当前设置(与SVN一起使用)。我基本上已经创建了一个包含迷你文件系统层次结构的存储库,其中包括自己的bin和lib dirs。在这棵树的根目录中有一个脚本,该脚本将设置环境,以将这些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内部有多个项目及其相应的库。我知道这不是一个标准项目,但是对于我团队中的其他人来说,很容易检出仓库,运行" setup_env.bash"脚本并在其本地拥有所有项目的最新版本退房。他们不必担心安装/更新/ usr / bin或者/ usr / lib的麻烦,这使得拥有多个签出项和每次签出都具有非常本地化的环境变得很简单。有人也可以仅管理整个存储库,而不必担心卸载任何程序。

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

回答

还有另一种嵌套git repos的方法,但是它不能解决我们所追求的问题。不过,对于正在寻找解决方案的其他人,我仍然是:

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