![](/img/trans.png)
[英]Git rebase vs merge after rebase master on feature branch
[英]git merge/rebase feature branch after master rename script
背景:我正在為Drupal核心(PHP)制作補丁,其中將當前使用PSR-0的模塊類文件上移兩個目錄,因此它們將改用PSR-4。 這會讓很多人生氣,因為很多待處理的補丁程序/本地功能分支將需要重新滾動。 我想找到一種方法來盡可能地減輕痛苦。
有一個帶有公共主分支的大型項目,許多人都有自己的本地特色分支。
在master分支上,我們添加了一個腳本 , 該腳本將移動一堆文件。 以前位於core/modules/$module/lib/Drupal/$module/Foo/Bar.php
每個文件core/modules/$module/lib/Drupal/$module/Foo/Bar.php
將向上移動兩個目錄 ,因此它成為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
編輯II:以下手動命令可以解決問題:(所有本地更改都在“核心”子目錄中)
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 filter-branch
可能是您想要的工具。
您可能想要使用類似以下的內容:
git filter-branch --tree-filter \
'git mv core/modules/views_ui/lib/{Drupal/views_ui/,}NewClass.php' \
-- origin/master..master
一個使用git倉庫的例子:
$ git co -b foo 1f6fb7ffc344e59589ac794ce7ae47ae7c2cff42
$ git log --name-status -n 3
commit 1f6fb7ffc344e59589ac794ce7ae47ae7c2cff42
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Fri Nov 8 20:34:35 2013 +0100
l10n: de.po: improve error message when pushing to unknown upstream
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
M po/de.po
commit 1d38363d86d16dee58df15a047d448baee6435ba
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Sat Nov 2 18:58:52 2013 +0100
l10n: de.po: translate 68 new messages
Translate 68 new messages came from git.pot update in 727b957
(l10n: git.pot: v1.8.5 round 1 (68 new, 9 removed)).
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
M po/de.po
commit 1b12df5262aae78b5fbcdb94e718d19710ce12a5
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Sat Nov 2 18:56:14 2013 +0100
po/TEAMS: update Thomas Rast's email address
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
M po/TEAMS
$ git filter-branch --tree-filter 'git mv po/de.po de.po' -- foo^^^..foo
Rewrite 1f6fb7ffc344e59589ac794ce7ae47ae7c2cff42 (3/3)
Ref 'refs/heads/foo' was rewritten
$ git log --name-status -n 3
commit 4c2629a746d42a0eed79fb7be5fc4f66258c0f3f
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Fri Nov 8 20:34:35 2013 +0100
l10n: de.po: improve error message when pushing to unknown upstream
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
M de.po
commit 67aab1af4cf200998c565e31a75a107469f3da78
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Sat Nov 2 18:58:52 2013 +0100
l10n: de.po: translate 68 new messages
Translate 68 new messages came from git.pot update in 727b957
(l10n: git.pot: v1.8.5 round 1 (68 new, 9 removed)).
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
M de.po
commit 31161ea7d16d531dd49f13ac8675b2f9c46ab0eb
Author: Ralf Thielow <ralf.thielow@gmail.com>
Date: Sat Nov 2 18:56:14 2013 +0100
po/TEAMS: update Thomas Rast's email address
Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
Acked-by: Thomas Rast <tr@thomasrast.ch>
A de.po
M po/TEAMS
D po/de.po
如果我對您的理解正確,這就是您想要的。
看起來普通的git rebase
實際上還不錯!
在上圖中的方案中,這將是
git checkout dev-local
git rebase origin/master
php move-files-around.php
git add -A .
git commit -m"Move locally added files to their new location"
可以通過一些交互式的基礎來增強它的效果,以使其看起來好像直接在其新位置中創建了本地添加的文件一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.