使用多个Git

我有以下dir结构

root root/framework (Yii) root/protected/messages 

所有这个文件夹必须是单独的git回购

我想要做的是

  1. rootroot/framework必须是单独的回购。 但

    • root/framework必须拉,因为我没有推这个存储库的访问。 我是说我拉我父母回购时,但我不推,当我推父回购。

    • 另一个问题是,Yii(root / framework)的远程目录结构看起来像http://screencast.com/t/mU1TgXuZDv我只需要框架文件夹的内容。 我怎样才能把这个文件夹的内容到root/framework

  2. 为了使root/protected/messages分开git回购,所以,当我推拉root git回购,也为此做一个。 换句话说,推拉与父母一到两个单独的遥控器。

为了解决第二个问题,我在root/protected/messages里初始化了新的repo,但是现在他们单独推拉。 我的意思是,我希望他们一次推动和改变2个遥控器的变化。 无法弄清楚如何做到这一点。

我也不知道第一个问题。

有什么build议么?

  1. 为了在父git库中创建一个单独的独立git仓库,你需要研究Git子模块( http://git-scm.com/book/en/Git-Tools-Submodules )。 这些基本上允许你创建一个完全独立的git仓库,它本身就是一个git仓库。

  2. 创建子模块的命令是git submodule add git://path/to/gitname.git folder-containing-the-inner-git 。 当然你需要在执行这个命令之前先cd到父文件夹中,在你的情况下这将是rootgit://path/to/gitname.git将成为Yii的git url,而folder-containing-the-inner-git将成为root/framework

  3. 为了拉动整个git回购的Yii的特定文件夹,你可能想要尝试在这个问题上对stackoverflow建议git checkout 如何拉特定的目录与git 。 我从来没有尝试过这个。
    另外,从Git 1.7你也可以做一个sparse checkouthttps://www.kernel.org/pub/software/scm/git/docs/v1.7.0/git-read-tree.html#_sparse_checkout )。 尽管您仍然需要获取整个回购。

  4. 一旦你在root使用git子模块创建一个独立的git repo,你将不得不在root/protected/messages单独推拉git。 然而,你可以通过为root内部的repo创建一个git钩子( http://git-scm.com/book/en/Customizing-Git-Git-Hooks )来自动执行这个过程。 一个钩子是一个脚本,可以执行特定的git事件/操作,如提交,合并等。这些事件的完整列表,你可以参考这个网页… http://www.manpagez.com/man/ 5 / githooks /
    似乎没有一个git pushpull事件。 然而,有一个git merge事件… post-merge

    这个钩子是由git merge调用的,当在本地仓库上完成git pull时会发生这种情况。 钩子接受一个参数,一个状态标志指定是否合并完成是一个壁球合并。 这个钩子不能影响git合并的结果,如果合并由于冲突而失败,则不执行。

    该钩子可以与相应的预提交钩子一起使用,以保存和恢复任何形式的与工作树相关的元数据(例如:权限/所有权,ACLS等)。 有关如何执行此操作的示例,请参阅contrib / hooks / setgitperms.perl。

所以你可以写一个简单的bash脚本,如:

cd root/protected/messages
git pull origin master

所以,每次从root的外部回购仓库中,这个脚本都会被解雇,你也可以把内部回购仓库的内容也拉出来。 然而,这将发生在每一次合并,而不仅仅是一个拉的合并,所以你可能要小心。

希望这可以帮助。

你可以尝试更直接的方式:

  • 初始化你的git仓库,
  • 将你的root/framework添加到.gitignore中;
  • root/framework并在那里初始化新的git仓库;

你将有matroshka风格回购。 但坦率地说,它们比git-submodules解决方案更难支持,因为root repo完全不知道其他的回购,而且都push esh,需要在每个repo中分别进行。