Wordpress插件具有免费和PRO版本。 PRO版本包含其他文件,这些文件分散在整个代码库中。
在git中跟踪以下两个版本的最优策略是什么:
遵循免费与专业版二分法之后,有许多Wordpress插件。他们是如何版本的?
答案 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很简单–容易