我正在寻找一种实用的方法来处理私有和公共存储库,其中特定文件夹中的私有存储库内容可能与公共分支中的内容不同。此文件夹必须存在于两个分支中,并且其内容在两个存储库中都会被跟踪,但绝不能合并。
这是存储库的简化设置:
/folderA <-- public content
/folderB <-- mixed public & private content
/folderB/private.files <-- this file is different in public & private repos
/folderB/newPrivateFolder <-- private repo may add more private-only folders here
这些是我看似简单的要求,但我还没有找到一个好的工作解决方案:
private.files
必须存在 public repo中,并且项目的默认内容才能正常工作private.files
的更改不应与私人回购合并private.files
更改必须在私人回购中跟踪,因为团队成员需要private.files
的更改绝不能与公共回购合并folderB
的其他文件/文件夹绝不能添加到公开回购私人回购是公共回购的副本。
我尝试过:
我还没有尝试过:
我还能尝试其他什么?
也许已经有了这个问题的解决方案 - 但我一直在网上看几十篇SO和几十篇文章,但似乎没有办法解决这个分歧的文件夹内容问题。
答案 0 :(得分:1)
在类似的情况下(部署到具有小的本地但永久修改的不同安装)我使用了一个主分支,在所讨论的文件夹中不包含任何内容或虚拟文件。然后对于每个本地配置(在您的情况下将是私有和公共)我创建了一个分支主,并在那里做了相关的更改。
开发发生在master上,偶尔我会切换到其他分支(私有/公共)并从master合并到这些分支,从不反过来。
不同的配置(私有/公共)只共享来自master的代码,而不是本地修改,我可以无限期地保留它们,并且我仍然只有一个中心位置用于更改/开发(主分支)
答案 1 :(得分:1)
现在我觉得这很简单。实质上,您只需在合并时删除folderB并将其替换为其公共内容,然后提交。
基本设置要求:
现在私人回购已经进行了修改&amp;添加了folderA和folderB并且你想将除了folderB中的更改之外的所有更改合并回公共仓库,你合并如下(我建议另外一个合并分支来安全地试验它):
git checkout merge-branch
git merge -s recursive -Xtheirs --no-edit --no-commit private-branch
rm -rf folderB
git reset <tree-ish> -- folderB/
git checkout --theirs <tree-ish> -- folderB/
这是做什么的:
我不确定是否需要重置和结账,但无论如何我都在做。随意尝试。
因此,如果在合并之后和提交之前清理工作目录,则私有分支中对folderB的任何更改的提交历史记录都不会添加到公共存储库中。
我尝试使用合并后的钩子来完成这项工作,但如果你不提交它似乎没有运行。此外,将所有命令放在一个脚本中更容易。
将公共回购更改合并回私有仓库正常工作,无需其他步骤。
答案 2 :(得分:0)
由于.git不支持.ignore(通过远程或分支差异);这是我在NPM中的简单解决方法:
"scripts": {
"deploy:public": "git add . && git commit -am 'master src committed'",
"deploy:private": "git add . && git rm -r --cached src/* && git commit -am 'master src omitted.'" }