使用多个Git

时间:2013-03-03 08:57:22

标签: windows git github

我有以下dir结构

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

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

我想做的是

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

    • root/framework必须只是因为我没有对此存储库的推送访问权限。我的意思是当我拉父母回购时我想拉yii,但是当我推动父回购时我不想推。

    • 另一个问题是,Yii(root / framework)的远程目录结构看起来像http://screencast.com/t/mU1TgXuZDv 我只需要框架文件夹的内容。如何将此文件夹的内容仅提取到root/framework

  2. 要使root/protected/messages单独使用git repo,以便在我推送&拉root git repo,也为这个做。换句话说,推动&拉父母一到两个单独的遥控器。

  3. 为了解决第二个问题,我在root/protected/messages内部初始化了新的仓库,但现在他们推动&分开拉。我的意思是,我希望他们推动&一次拉出2个遥控器的变化。无法弄清楚该怎么做。

    我也不知道第一个问题。

    有什么建议吗?

2 个答案:

答案 0 :(得分:1)

  1. 要在父git仓库中创建单独且独立的git仓库,您需要查看Git子模块(http://git-scm.com/book/en/Git-Tools-Submodules)。这些基本上允许您在目录中创建一个完全独立的git repos,它本身就是一个git存储库。

  2. 要创建子模块,命令为git submodule add git://path/to/gitname.git folder-containing-the-inner-git。当然,在发出此命令之前,您需要进入父文件夹,在您的情况下,这将是rootgit://path/to/gitname.git将是Yii的git网址,folder-containing-the-inner-git将是root/framework

  3. 为了提取整个git仓库中Yii的特定文件夹,您可能需要按照stackoverflow How to pull specific directory with git上此问题的建议尝试git checkout。我自己从未尝试过这个。
    此外,从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 hook(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时会发生这种情况      在本地存储库上完成。钩子采用单个参数,即状态      指定合并是否为squash合并的标志。      这个钩子不会影响git merge的结果,也不会执行,      如果合并因冲突而失败。

         

    此挂钩可以与相应的预提交一起使用      hook用于保存和恢复与之关联的任何形式的元数据      工作树(例如:权限/所有权,ACLS等)。看到      contrib / hooks / setgitperms.perl以获取如何执行此操作的示例。

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

    cd root/protected/messages
    git pull origin master

    因此,每次从root中的外部仓库撤出时,此脚本都会被触发,您也可以拉出内部仓库的内容。但是,这将在每次合并时发生,而不仅仅是在拉动时发生的合并,因此您可能需要小心。

    希望这有帮助。

答案 1 :(得分:0)

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

  • root;
  • 中初始化您的git repo
  • root/framework添加到.gitignore;
  • 转到root/framework并在那里初始化新的git存储库;

你将有matroshka风格的回购。但是,坦率地说,它们比git-submodules解决方案更难支持,因为root repo根本不知道其他回购,而push esh,pull需要在每个回购中单独完成。