使用 SVN,我在服务器上保存了一个大型存储库,并在几台机器上 checkout 。这是一个非常好的备份系统,让我可以轻松地在任何机器上工作。我可以 checkout 一个特定的项目,提交并更新“主”项目,或者我可以 checkout 整个项目。
现在,我有一堆 git 存储库,用于各种项目,其中有几个在 github 上。我也有我提到的 SVN 存储库,通过 git-svn 命令导入..
基本上,我喜欢将我所有的代码(不仅仅是项目,还有随机的片段和脚本、一些东西,比如我的简历、我写的文章、我制作的网站等等)放在一个大的存储库中,我可以轻松地克隆到远程机器或内存棒/硬盘上作为备份。
问题是,因为它是一个私有(private)存储库,而 git 不允许 checkout 特定文件夹(我可以将它作为一个单独的项目推送到 github,但更改会出现在主存储库和子 repo )
我可以使用 git 子模块系统,但它并没有按照我想要的方式运行(子模块是指向其他存储库的指针,并不真正包含实际代码,所以它没用用于备份)
目前我有一个 git-repos 文件夹(例如,~/code_projects/proj1/.git/~/code_projects/proj2/.git/),在对 proj1 进行更改后,我执行 git push github
,然后我将文件复制到 ~/Documents/code/python/projects/proj1/并进行一次提交(而不是单个 repo 中的大量提交)。然后执行 git push backupdrive1
, git push mymemorystick
等
那么,问题是:您的个人代码和项目如何与 git 存储库保持同步和备份?
最佳答案
我强烈建议不要将不相关的数据放在给定的 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
您可以在每个工作克隆中拥有多个 Remote ,以便于 多方同步:
$ cd ~/dev
$ git clone /repos/foo.git # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...
然后您可以从每个“源”获取/pull 、工作和提交 本地,然后推送(“备份”)到这些 Remote 中的每一个,当你 准备好了类似的东西(注意这如何 push 相同提交 以及每个 Remote 的历史记录!):
$ 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 存储库,以便将它们全部备份在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862/