1

我有以下目录结构

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

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

我想做的是

  1. root并且root/framework必须是单独的回购。但

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

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

  2. 制作root/protected/messages单独的 git repo 以便当我推拉rootgit repo 时,也可以为它做这件事。换句话说,与父母一到两个单独的遥控器一起推拉。

为了解决第二个问题,我在里面初始化了新的 repo,root/protected/messages但现在他们分别推拉。我的意思是,我希望他们一次向/从 2 个遥控器推送和拉取更改。无法弄清楚该怎么做。

我也不知道第一个问题。

有什么建议么?

4

2 回答 2

1
  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 进入父文件夹,在您的情况下将是root. 将是git://path/to/gitname.gitgit urlYii和.folder-containing-the-inner-gitroot/framework

  3. 为了提取整个 git repo 的特定文件夹,您可能需要按照 stackoverflow How to pull specific directory with git上的这个问题的建议Yii进行尝试。我自己从未尝试过。 此外,你也可以做一个(https://www.kernel.org/pub/software/scm/git/docs/v1.7.0/git-read-tree.html#_sparse_checkout)。尽管您仍然需要获取整个 repo。git checkout
    Git 1.7sparse checkout

  4. 一旦你使用 git submodules inside 创建了一个单独的 git repo root,你将不得不root/protected/messages单独在里面推送和拉取 git。但是,您可以通过为内部存储库创建一个 git 挂钩 ( http://git-scm.com/book/en/Customizing-Git-Git-Hooks ) 来自动化此过程root。钩子是一个脚本,可以在特定的 git 事件/操作(如提交、合并等)上执行。有关这些事件的完整列表,您可以参考此页面... http://www.manpagez.com/man/ 5/githooks/
    好像没有a git pushor的事件pull。但是有一个事件git merge...... post-merge

    这个钩子由 git merge 调用,当在本地存储库上执行 git pull 时会发生这种情况。该钩子采用单个参数,一个状态标志,指定正在完成的合并是否是壁球合并。如果由于冲突导致合并失败,则此钩子不会影响 git merge 的结果并且不会执行。

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

因此,您可以编写一个简单的 bash 脚本,例如:

cd root/protected/messages
git pull origin master

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

希望这可以帮助。

于 2013-03-03T08:59:05.177 回答
0

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

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

您将拥有 matroshka 风格的存储库。但是,坦率地说,它们比解决方案更难支持git-submodules,因为rootrepo 根本不知道其他 repo,并且所有pushesh, pulls 都需要在每个 repo 中单独完成。

于 2013-03-03T09:06:14.497 回答