簡體   English   中英

主重命名腳本后的git merge / rebase功能分支

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM