【发布时间】:2014-01-03 08:48:32
【问题描述】:
背景:我正在开发 Drupal 核心 (PHP) 的补丁,其中当前使用 PSR-0 的模块类文件将向上移动两个目录,因此它们将使用 PSR-4。这会让很多人生气,因为很多待处理的补丁/本地功能分支需要重新发布。我想找到一种方法让这个过程尽可能轻松。
有一个大项目有一个公共的 master 分支,还有很多人有自己的本地特性分支。
在 master 分支上,我们添加a script,它将移动一堆文件。以前在core/modules/$module/lib/Drupal/$module/Foo/Bar.phpwill be moved two directories up 中的每个文件,所以它变成了core/modules/$module/lib/Foo/Bar.php。每个模块都会发生这种情况,因此 $module 可以采用多个值。
本地功能分支可以修改现有文件,但也可以添加新文件或删除现有文件。他们甚至可以重命名文件。所有这些都在“旧”目录结构中。
合并或变基实际上确实将大量或所有修改保存到重命名的文件中 - 尽管我不确定它是否可以 100% 被信任。
但是创建的新文件会保留在旧位置,需要手动移动。
一种更可靠的方法是在本地分支上执行脚本,对于每个不在 master 上的本地提交,然后以某种方式重新定位本地分支。
我们的目标是让所有本地提交看起来好像是在新文件结构上完成的。
例如。如果文件是在core/modules/views_ui/lib/Drupal/views_ui/NewClass.php 中创建的,那么它应该看起来像是直接在core/modules/views_ui/lib/NewClass.php 中创建的
自动化这一切的最佳方法是什么?
理想情况下,我会为其他开发人员提供一个脚本,他们无需太多手动工作即可使用。
git filter-branch 看起来很有希望,但我需要以非常具体的方式使用它。
编辑:澄清图表
master
m5
^
|
|
+
m4
^
|
|
+ local dev
master rewritten local history moved
moved +--------> new1 +-------> new2 +--------> new3
m3 ^ ^ ^
^ | | |
|move |move |move |move
|script |script |script |script
| | | |
+ | | +
before + + local dev
move +---------> old1 +-------> old2 +--------> old3
m2 old local history
^
|
|
+
m1
EDIT II:以下 manual 命令可以解决问题: (所有本地更改都在“核心”子目录中)
git checkout m3
git branch dev-new; git checkout dev-new
rm -r core
git checkout old1 .
php core/scripts/switch-psr4.php
git add -A .; git commit -m"transformed old1"
rm -r core
git checkout old2 .
php core/scripts/switch-psr4.php
git add -A .; git commit -m"transformed old2"
rm -r core
git checkout old3 .
php core/scripts/switch-psr4.php
git add -A .; git commit -m"transformed old3"
【问题讨论】:
-
关于图表的注意事项:在此特定历史记录重写之前和之后可能需要更多操作。但是这些通过定期变基很容易。因此,让我们专注于这并不容易的一步。
标签: git rename git-filter-branch