2016-10-28 12 views
5

При добавлении поддерева:Нажатия сжато изменение поддерева в Геррит

мерзавец поддерево добавить prefix = Vendor https://example.com/repo мастера --squash

Есть два коммитов создан. Один за раздавленного поддерева совершает

Squashed 'vendor' changes from 15fc2b6..c6dc29b 

и слияние совершают

Merge commit 'SHA1' into master 

Когда я хочу, чтобы подтолкнуть это изменение Геррит, он нуждается в changeID. Но мерзавец не позволяет мне сделать

git rebase -i HEAD~2

и переделок, как я могу сделать для любого другого совершить как это сжато совершить.

Теперь я не могу нажать это изменение на gerrit из-за этого. Я не могу совершать изменения в головах (git) напрямую и разбивать материал на супермодуле. Он должен пройти сборку и тестирование. Любое предложение или помощь приветствуются.

ответ

0

git filter-branch может делать много вещей, в то же время обновляя указатели фиксации, чтобы график фиксации оставался неповрежденным. Один из них выполняет команду для редактирования всех сообщений фиксации, таких как крючок фиксации Gerrit's-msg.

git filter-branch HEAD...HEAD~1 захватывает все коммиты в HEAD, но не HEAD ~ 1, что для слияния git-поддерева - это только слияние и сквош.

git filter-branch --msg-filter принимает команду для запуска, которая получает сообщение о фиксации, отправленное на stdin, и записывает новый в стандартный вывод. script-скрипты commit-msg работают над файлом, поэтому для написания исходного сообщения в файл требуется запустить скрипт оболочки, запустить hook, а затем cat файл в stdout.

Я положил все это в сценарии для запуска до нажатия на Геррит:

# This command re-writes the history after doing a git subtree {pull|add} 
# to add Gerrit Change-Id lines to the squash commit message. 
# 
# It assumes that HEAD is the merge commit merging the subtree into HEAD. 
# The original HEAD commit will be backed up under refs/original, which 
# is helpful if something goes wrong. 

set -e 
set -o pipefail 

GIT_DIR=$(readlink -f $(git rev-parse --git-dir)) 
TMP_MSG="${GIT_DIR}/COMMIT_MSG_REWRITE" 

git filter-branch --msg-filter \ 
    "cat > ${TMP_MSG} && \"${GIT_DIR}/hooks/commit-msg\" ${TMP_MSG} && \ 
    cat \"${TMP_MSG}\"" HEAD...HEAD~1 

rm -rf ${TMP_MSG}