Git: 两个子目录,如何从不同的分支拉取并推送到一个master分支

Git: Two subdirectories, how to pull from different branches and push to one master branch

我已经看到关于如何将不同的目录推送到不同的分支,如何从不同的目录 pull/push 从不同的目录中 pull/push 等的答案。但是我在结合这两件事时遇到了问题。

所以我有一个 git 存储库,比如 mydir/,它有两个子目录:

1.)mydir/package 2.)mydir/foo。

mydir/package 是从另一个 git 存储库克隆而来的,我已将其设置为从原始 git 存储库中提取并推送到个人存储库。我主要在这个 repo 的 develop 分支工作。

mydir/foo目录是我写个人代码的地方。它只拉和推到个人回购。它使用 mydir/package 中的源代码,这就是我将这些目录保存在一个存储库中的原因。

现在的样子:差不多就好了。我移动到 mydir/package 文件夹,我可以根据需要更新、推送、拉取到正确的位置(不是正确的分支,而是正确的存储库)。 mydir/foo.

也是如此

出了什么问题: 如果我从mydir/ push,然后去查看personal repo,有两个分支;掌握和发展

大师:repo有一个文件夹/foo,没问题。但是没有/package文件夹

开发:repo 包含 /package 的所有内容。没有 /foo 文件夹,也没有父目录。

为什么会出现问题:我已经能够对所有内容使用源代码管理,但是将两个目录的 pushes/changes 放在两个目录上很烦人单独的分支机构。我必须分别进入每个目录和commit/add/push/etc,然后每个目录都进入不同的分支。文件已备份,这很好,但对于下一个试图克隆我的存储库的人来说,这并不实用。

我想要的:除了从 mydir/ 推送外,这个 repo 的几乎所有内容都对我有用。我想从 mydir/ 拉出我的个人仓库(这样我就不会不小心更新 mydir/package 文件夹)。我仍然想从 mydir/package 中拉出 develop 以从原始包的 develop 分支中拉出。我只想让 mydir 中的 committing/adding/pushing 表示 "update the personal repo's master branch to now contain the current status of mydir/package and mydir/foo." 当我查看这个个人仓库时,我想查看 master 分支上的两个文件夹。

我尝试了什么->发生了什么: 1.) git 推送远程主机(来自 mydir/package 文件夹)。

错误 ! [rejected] master -> master(先获取) 错误:无法将某些引用推送到 'mypersonalrepo.git'

2.) 拉取个人仓库的请求以合并 develop 和 master 分支

mydir 文件夹然后有 mydir/package(仍然在 develop 分支上并且有我所有的修改),mydir/foo(在正确的分支上),然后是所有文件来自远程仓库的 master 分支。

3.) git 添加包/ -> git push origin master

没有任何变化。这些文件夹仍然被推送到个人仓库的单独分支。

作为参考,如果我从 mydir/package 键入 git remote show origin,它会是什么样子,也许我需要创建第二个远程仓库来进行这种自定义?

remote origin
Fetch URL: their_package_repo.git
Push  URL: mypersonal_repo.git
HEAD branch: master
Remote branches:
develop                         tracked
master                          tracked
some_other_branch               tracked
Local branches configured for 'git pull':
  develop merges with remote develop
  master  merges with remote master
Local refs configured for 'git push':
  develop pushes to develop (fast-forwardable)
  master  pushes to master  (local out of date)

直接的答案是否定的。没有这样的功能可以单独拉分支并将所有文件夹从分支推送到分支。

  • 如果package文件夹作为foo文件夹的参考或库代码,您应该将它们管理到同一个分支(例如master)。
  • 如果 package 文件夹与 foo 文件夹分开工作,您应该将它们管理到不同的分支。

为什么不可能: 当你在 master 分支中将 package 文件夹和 foo 文件夹一起推送时,这意味着这两个文件夹是两者都通过 master 分支中的 git 添加到版本控制。当其他开发者 clone/pull 您的个人仓库时, package 文件夹和 foo 文件夹将显示在 master 分支中。即使有其他方法可以为其他开发人员(git fetchgit checkout origin/master -- foo)仅显示 master 分支上的 foo 文件夹,但工作目录不是 origin/master。因此,当开发人员将他们的本地更改推送到您的个人 repo 时,git 将首先点击他们进行拉取,并且 packagefoo 文件夹最终也会显示在 master 分支中.