我在休假期间,我的同事将为我工作一些项目,所以自然地我与他共享了我的存储库,以便他访问我的代码库。
但是,其中有数十个文件夹,并且存储库中并非每个文件夹都与他相关。
我只是最近才开始使用git,还没有在线发现任何暗示可以实现的东西。
如何仅共享存储库中的相关文件夹?
答案 0 :(得分:2)
没有简单的方法可以做到这一点。在git中,提交代表回购内容的完整快照。要创建仅包含某些文件夹的回购版本,您必须创建仅包含这些文件夹的一组新提交-即单独的历史记录。然后,很难将在该存储库上完成的工作重新整合到原始存储库中。
这是每个项目都有自己的仓库的原因之一。这里的“每个项目”一词有点含糊,但要点是回购应包含通常一起使用/更改的资产组。习惯了TFVC等的人主张使用所谓的“ monorepo”结构。如果您使用这样的结构,则说明您正在使用git的纹理。
如果您有一组相关项目,则可以将它们各自放在自己的存储库中,或者(1)使用构建工具来记录依赖项并根据需要进行组装(这是我的建议),或者(2)使用子模块。
答案 1 :(得分:0)
这是一个例子。
假设您的存储库有4个子文件夹(foo1 foo2 foo3 foo4
),并且您想与同事共享2个子文件夹(foo2 and foo4
),而您的分支机构是master
。
您的存储库树:
.
├── foo1
├── foo2
├── foo3
└── foo4
如果您不熟悉git,则可以在执行以下步骤之前进行新的克隆。即使不成功,您的原始存储库也不会混乱。
1)建立不包含foo1
和foo3
的分支:
git checkout -b base master
git rm -rf foo1 foo3
git commit -m 'base for colleague'
2)为您的同事从colleague
创建一个带有初始分支base
的捆绑包:
git checkout --orphan colleague base
git commit -m 'init colleague'
git bundle create colleague.bundle colleague
3)将文件colleague.bundle
共享给您的同事。它可以用作只读远程存储库。
4)您的同事从捆绑软件中克隆并创建他/她自己的存储库myrepo
:
git clone <path to colleague.bundle> -- myrepo
cd myrepo
git checkout -b master origin/colleague
#in the repo, there are only foo2 and foo4
#make his/her changes to foo2 and foo4, and commit them
5)您的同事给您他/她的新承诺,然后您将其应用。这是可能的方法之一:
#your colleague creates a bundle 'return.bundle' and send it to you
git bundle create return.bundle master
#you fetch his/her 'master' from the bundle and apply the new commits to your own 'master'
git fetch <path to return.bundle> master:from_my_colleague
git checkout master
git cherry-pick colleague..from_my_colleague
#after all is done, you could delete those branches
git branch -D base colleague from_my_colleague
这些新提交的提交者将是您,而他们的作者是您的同事。首先,您还可以简单地将分支机构colleague
推送到真正的远程存储库,并要求您的同事提取它并从中创建master
。但这可能涉及存储库管理,例如存储库创建和访问控制,而捆绑包则更为简单。最后,您的同事还可以将他/她的master
推送到一个真正的远程存储库,然后将其提取到您的存储库中,并将新提交应用于您的master
。