保持自定义修改的开源软件最新的git工作流?

保持自定义修改的开源软件最新的git工作流?,git,open-source,workflow,branching-and-merging,Git,Open Source,Workflow,Branching And Merging,我们大学在我们管理的服务器上为校园各系提供网络托管服务。安装开源第三方程序需要修改程序中的文件权限和代码才能运行。(如果您熟悉,我们使用的是suEXEC。) 我们目前通过安装脚本提供WordPress。用户上传最新的稳定版本,并通过SSH运行服务器端PHP脚本。此PHP脚本修改所有文件/文件夹的文件权限,在各种文件中添加/删除一些代码,并创建一些新文件。当发布新的稳定版本时,此安装程序脚本是一个麻烦的平衡动作 我想开始使用版本控制(特别是git)来跟踪我们的自定义更改,而不是依赖脚本来进行更改,

我们大学在我们管理的服务器上为校园各系提供网络托管服务。安装开源第三方程序需要修改程序中的文件权限和代码才能运行。(如果您熟悉,我们使用的是suEXEC。)

我们目前通过安装脚本提供WordPress。用户上传最新的稳定版本,并通过SSH运行服务器端PHP脚本。此PHP脚本修改所有文件/文件夹的文件权限,在各种文件中添加/删除一些代码,并创建一些新文件。当发布新的稳定版本时,此安装程序脚本是一个麻烦的平衡动作

我想开始使用版本控制(特别是git)来跟踪我们的自定义更改,而不是依赖脚本来进行更改,但我不确定要使用的工作流。我熟悉分支和合并,但不确定在发布新版本时如何集成我们的旧更改


我的git工作流程应该是什么,以集成WordPress核心的新更改,同时保留旧的自定义更改?

我的一般方法是有两个分支,
上游
。创建您的存储库(它将从
分支开始),签入您使用的上游代码的最新副本,然后使用
git branch upstream
创建
upsteram
分支。另外,创建一个标记,指示已导入的上游版本,例如
git tag wordpress-1.0
。我通常为此使用轻量级标记(没有任何注释的标记,基本上只是指向修订的指针)

master
分支中进行所有修改

[wordpress-1.0]
v
* <- upstream
 \
  +--*--*--* <- master 
现在,请签出
master
,并合并上游更改。此时,您可以选择如何合并,例如采用新的上游版本、采用您的版本或采用合并的更改,就像在正常合并中一样

[wordpress-1.0]
|  [wordpress-1.1]
v  v
*--*--------+ <- upstream
 \           \
  +--*--*--*--* <- master 

希望这对您有所帮助,如果您还有任何问题,请告诉我。

我建议将您的更改保留在分支中,并在更新时根据WordPress的最新版本重新设置分支。在粗略的时间表中

              +-- WordPress 1.0
              v
[master] --*--*
               \
[custom]        *--*--*     <- your customizations
更新:提供一些基本原理。。。我喜欢这种解决这个问题的方法,因为它明确区分了WordPress的代码和您的定制。当你得到新版本的WordPress时,你真的对“集成”不感兴趣。您有兴趣将您的自定义重新应用到新版本的WordPress。在我看来,通过重基一次提交一次提交是最容易做到的。任何冲突都意味着一个定制可能会中断,因此旧的定制提交无论如何都是垃圾——最好只是从源头解决问题并保持更新的历史记录干净

更新
master
并重新设置和推送
custom
后,协作者只需根据最新版本重新设置其正在进行的工作的基础


这只是我的观点,作为一个坚定的“再基地>合并”支持者。Git的美妙之处在于很少有一个正确的答案。只要不断调整,直到你找到适合你的东西。

我建议不要这样做,因为重新定基可能会导致很多问题。它丢失了历史记录(您无法返回到您之前实际部署的版本,也无法判断您何时进行了哪些合并),并且让您的工作分支一直重新调整会使您与其他人协作变得更加困难,因为现在他们也需要重新调整他们所做的一切。重新调整最适合于尚未与其他人共享的更改,或者已知的不稳定更改,而不是每次发布新版本时都在上游重新调整您的整个历史记录。如果您无法沟通,重新调整可能会导致问题,但这是完全可以管理的。只有在不保留对提交的引用的情况下,历史才会丢失—只需标记已部署的版本,就不会丢失任何内容。在我们的例子中,重定基址似乎是一个很好的解决方案,因为我们只将源代码作为tarball共享。没有其他使用最终产品的开发人员像我们一样对核心进行更改,因此不需要与其他人共享。这在技术上是可行的,但每次都将我们的更改重新应用到最新的源代码听起来更符合逻辑,因此重定基址听起来比合并更好。
[wordpress-1.0]
|  [wordpress-1.1]
v  v
*--* <- upstream
 \
  +--*--*--* <- master 
[wordpress-1.0]
|  [wordpress-1.1]
v  v
*--*--------+ <- upstream
 \           \
  +--*--*--*--* <- master 
[wordpress-1.0]
|  [wordpress-1.1]
|  |           [wordpress-2.0]
v  v           v
*--*--------+--*-+ <- upstream
 \           \    \ 
  +--*--*--*--*----*--* <- master 
              +-- WordPress 1.0
              v
[master] --*--*
               \
[custom]        *--*--*     <- your customizations
              +-- WordPress 1.0
              |     +-- WordPress 1.1
              v     v
[master] --*--*--*--* 
               \
[custom]        *--*--*     <- your customizations
              +-- WordPress 1.0
              |     +-- WordPress 1.1
              v     v
[master] --*--*--*--* 
                     \
[custom]              *--*--*     <- your customizations