我有以下dir结构
root
root/framework (Yii)
root/protected/messages
所有这个文件夹必须是单独的git repos
我想做的是
root
和root/framework
必须是单独的回购。但是
root/framework
必须只是因为我没有对此存储库的推送访问权限。我的意思是当我拉父母回购时我想拉yii,但是当我推动父回购时我不想推。
另一个问题是,Yii(root / framework)的远程目录结构看起来像http://screencast.com/t/mU1TgXuZDv
我只需要框架文件夹的内容。如何将此文件夹的内容仅提取到root/framework
?
要使root/protected/messages
单独使用git repo,以便在我推送&拉root
git repo,也为这个做。换句话说,推动&拉父母一到两个单独的遥控器。
为了解决第二个问题,我在root/protected/messages
内部初始化了新的仓库,但现在他们推动&分开拉。我的意思是,我希望他们推动&一次拉出2个遥控器的变化。无法弄清楚该怎么做。
我也不知道第一个问题。
有什么建议吗?
答案 0 :(得分:1)
要在父git仓库中创建单独且独立的git仓库,您需要查看Git子模块(http://git-scm.com/book/en/Git-Tools-Submodules)。这些基本上允许您在目录中创建一个完全独立的git repos,它本身就是一个git存储库。
要创建子模块,命令为git submodule add git://path/to/gitname.git folder-containing-the-inner-git
。当然,在发出此命令之前,您需要进入父文件夹,在您的情况下,这将是root
。 git://path/to/gitname.git
将是Yii
的git网址,folder-containing-the-inner-git
将是root/framework
。
为了提取整个git仓库中Yii
的特定文件夹,您可能需要按照stackoverflow How to pull specific directory with git上此问题的建议尝试git checkout
。我自己从未尝试过这个。
此外,从Git 1.7
起,您还可以执行sparse checkout
(https://www.kernel.org/pub/software/scm/git/docs/v1.7.0/git-read-tree.html#_sparse_checkout)。虽然你仍然需要获取整个仓库。
使用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 push
或pull
没有任何事件。但是git merge
... post-merge
:
这个钩子是由git merge调用的,当git pull时会发生这种情况 在本地存储库上完成。钩子采用单个参数,即状态 指定合并是否为squash合并的标志。 这个钩子不会影响git merge的结果,也不会执行, 如果合并因冲突而失败。
此挂钩可以与相应的预提交一起使用 hook用于保存和恢复与之关联的任何形式的元数据 工作树(例如:权限/所有权,ACLS等)。看到 contrib / hooks / setgitperms.perl以获取如何执行此操作的示例。
所以你可以编写一个简单的bash脚本,如:
cd root/protected/messages
git pull origin master
因此,每次从root
中的外部仓库撤出时,此脚本都会被触发,您也可以拉出内部仓库的内容。但是,这将在每次合并时发生,而不仅仅是在拉动时发生的合并,因此您可能需要小心。
希望这有帮助。
答案 1 :(得分:0)
您可以尝试更直接的方式:
root
; root/framework
添加到.gitignore
; root/framework
并在那里初始化新的git存储库; 你将有matroshka风格的回购。但是,坦率地说,它们比git-submodules
解决方案更难支持,因为root
repo根本不知道其他回购,而push
esh,pull
需要在每个回购中单独完成。