使用SVN,我有一个大的存储库,我保存在服务器上,并在几台机器上签出。这是一个非常好的备份系统,让我可以轻松地在任何机器上工作。我可以签出一个特定的项目,提交并更新“主”项目,或者我可以检查整个项目。
现在,我有一堆git存储库,用于各种项目,其中一些是在github上。我也有我提到的SVN存储库,通过git-svn命令导入..
基本上,我喜欢把我所有的代码(不仅仅是项目,而是随机的片段和脚本,一些像我的简历,我写的文章,我制作的网站等等)放在一个大的存储库中我很容易克隆到远程计算机上,或记忆棒/硬盘作为备份。
问题是,因为它是一个私有存储库,并且git不允许检出特定文件夹(我可以将其作为一个单独的项目推送到github,但是这些更改都出现在master-repo中,并且子回购)
我可以使用git子模块系统,但它也不是我想要的行为(子模块是指向其他存储库的指针,并不真正包含实际代码,所以它没用备份)
目前我有一个git-repos文件夹(例如,〜/ code_projects / proj1 / .git /〜/ code_projects / proj2 / .git /),在对proj1进行更改之后我做了git push github
,然后我将文件复制到〜/ Documents / code / python / projects / proj1 /并进行一次提交(而不是单个repos中的众多提交)。然后执行git push backupdrive1
,git push mymemorystick
等
所以,问题是:你的个人代码和项目如何使用git存储库,并保持同步和备份?
答案 0 :(得分:74)
我会强烈建议不要将不相关的数据放入给定的数据中 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
- 但不会抛出。{
现存的“本地”历史。
注意:子模块是一种包含共享相关的机制 血统,所以我确实不会认为它们是适合的工具 你想要解决的问题。
答案 1 :(得分:28)
我想添加到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
会将“主”分支推送到两者
那些远程存储库。
您还可以使用结构保存自己输入两次网址:
[url "<actual url base>"] insteadOf = <other url base>
答案 2 :(得分:3)
,我还没有尝试嵌套git存储库,因为我没有遇到过我需要的情况。正如我在#git channel上看到的那样,git似乎因嵌套存储库而感到困惑,即你正试图在git存储库中使用git-init。管理嵌套git结构的唯一方法是使用git-submodule
或Android的repo
实用程序。
至于你所描述的备份责任我说委托它...对我来说,我通常把每个项目的“origin”存储库放在网络驱动器上,定期备份工作由IT技术人员根据他们选择的备份策略。这很简单,我不必担心。 ;)
答案 3 :(得分:3)
我也对建议的处理方法感到好奇,并将描述我使用的当前设置(使用SVN)。我基本上创建了一个包含迷你文件系统层次结构的存储库,包括它自己的bin和lib目录。在这棵树的根目录中有一个脚本,它将设置你的环境以添加这些bin,lib等...其他dirs到适当的环境变量。所以根目录基本上是这样的:
./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标准方法来创建这样的环境并将项目分解到自己的存储库中?
答案 4 :(得分:2)
如何使用mr一次管理多个Git回购:
mr(1)命令可以在a上签出,更新或执行其他操作 一组存储库,好像它们是一个组合的存储库。它 支持subversion,git,cvs,mercurial,bzr的任意组合, darcs,cvs,vcsh,fossil和veracity repositories,以及对 可以轻松添加其他修订控制系统。 [...]
通过简单的shell脚本可以配置它。一些例子 它可以做的事情包括:
[...]
- 更新git存储库时,从两个不同的上游拉出并将两者合并在一起。
- 并行运行多个存储库更新,大大加快了更新过程。
- 记住由于笔记本电脑处于脱机状态而失败的操作,因此可以在重新联机时重试这些操作。
答案 5 :(得分:1)
还有另一种方法可以使用嵌套的git repos,但它并不能解决你遇到的问题。不过,对于那些正在寻找解决方案的人来说,我是:
在顶级git repo中,只需隐藏包含嵌套git repo的.gitignore中的文件夹。这样可以很容易地拥有两个独立的(但嵌套的!)git repos。