包含开源和专有(私有)部分的项目的git工作流程

时间:2018-07-06 03:34:56

标签: wordpress git plugins git-workflow

Wordpress插件具有免费和PRO版本。 PRO版本包含其他文件,这些文件分散在整个代码库中。

在git中跟踪以下两个版本的最优策略是什么:

  1. 免费版本在GitHub上是开源的,接受捐款;
  2. PRO版本已与专用存储库同步;
  3. 本地开发是在PRO版本上进行的(例如,为了使其能够正常工作);
  4. 两个历史都是相关的(PRO⊇free的历史)
  5. 低维护:
    1. 我们是git noobs
    2. 没有手动计算哪些文件适合放置在何处。

遵循免费与专业版二分法之后,有许多Wordpress插件。他们是如何版本的?

1 个答案:

答案 0 :(得分:1)

想到一些简单的方法...

单独的命名空间

将所有分散的文件移动到单独的名称空间目录(例如./pro)中,您可以在其中克隆单独的PRO存储库(仅包含PRO文件)。 缺点:必须将两个存储库的检出保持同步(即,如果您在一个存储库中切换到旧提交,则还总是需要在另一个存储库中切换到兼容的提交)回购)。

两个存储库

我想这就是normally done的样子。在两个不同的存储库中维护免费和PRO版本。让PRO repo定义要从中获取并合并更改的公共远程源。

cd ~/project-libre
git remote add origin GITHUB_PUBLIC_REPO

cd ~/project-pro
git remote add origin PRIVATE_REPO
git remote add libre GITHUB_PUBLIC_REPO  # to fetch and merge changes from

只要有更改提交到公共存储库,您就可以通过以下方式将其合并到您的PRO版本中:

cd ~/project-pro
git checkout master
git pull libre master --allow-unrelated-histories
git push origin master

只要要同步到发布的免费版本中的PRO版本中有更改,就可以使用git-format-patch将更改导出为补丁文件,然后另一端导入该补丁集,不包括免费版本中不会发布的任何文件。像这样:

cd ~/project-pro
git checkout master
git format-patch HEAD~3..HEAD  # Export e.g. last three commits as patches

现在切换到免费版本并应用补丁程序(使用git-am),从每次提交中排除免费版本忽略列表中的所有PRO文件(路径)。我将它们放在免费项目根目录下的.gitignore文件中,命令行假定POSIX shell可用(对.gitignore中的每个文件/路径重复--exclude参数)。

cd ~/project-libre
git checkout master
git am $(printf -- '--exclude=%s ' $(cat .gitignore)) ~/project-pro/*.patch    

两个分支

有两个分支,每个分支与另一个遥控器同步。

git remote add origin  GITHUB_PUBLIC_REPO
git remote add private PRIVATE_REPO

创建两个文件,一个免费,一个PRO:

touch free1 pro1

在master分支上,创建一个包含所有PRO文件的.gitignore

git checkout master
echo 'pro*' > .gitignore

git add .gitignore
git commit -m 'Add .gitignore ignoring PRO files'

将公共分支与公​​共存储库同步:

git push -u origin master

现在将分支主节点转移到私有PRO分支中,并清除.gitignore,因为在那里没有忽略PRO文件。

git checkout --branch master-private
echo > .gitignore

git commit .gitignore -m 'Clear .gitignore -- track all files here'

将私有分支与私有存储库同步:

git push -u private master-private

现在将free1和pro1文件提交到各自的分支:

git checkout master
git add free1
git commit -m 'Add free1'

git checkout master-private
git add pro1
git commit -m 'Add pro1'

然后将master合并为master-private,以使其包含完整的集合。

git checkout master-private
git merge master

您需要解决一个.gitignore冲突(或者您可以指定-X ours合并开关)。


稍后,您将在master-private分支(第3节)上进行一些开发,以修饰并创建适合两个分支之一的各种文件:

git checkout master-private
touch free2 pro2
echo xxx > free1
echo xxx > pro1

您不想枚举要提交的所有非PRO文件(第5.2节);这就是您拥有.gitignore的目的。您可以通过切换到master并提交所有适合的东西来使用它,然后再切换回master-private,然后提交剩下的东西。您需要先存储更改,因为更改更改会被分支覆盖。

git stash
git checkout master
git stash apply

您在这里遇到冲突,因为pro1的存储已更改但在master上已删除。您可以通过告诉git通过取消暂存来继续忽略它来解决它。

git reset HEAD .

现在提交所有可用文件:

git add free2  # Manually add the new files (easy and not violating § 5.2)
git commit -a -m 'Update to free1 and free2'

切换回专用分支,合并到更新的master分支中,然后再次从存储中提交其余文件。

git checkout master-private
git merge master
git stash pop  # The stash now applies cleanly and is removed
git add pro2  # Manual but necessary adding of new files (not violating § 5.2) 
git commit -a -m 'Update pro1 and pro2'

就是这样。


当您在GitHub上收到请求请求并合并它时。之后,只需将其与本地主机同步,然后将其合并到私有分支中即可:

git checkout master
git pull
git checkout master-private
git merge master
git push

git很简单–容易