2016-10-28 14 views
5

Trong khi thêm một cây con:Đẩy thay đổi cây con bị đè nén để Gerrit

git subtree thêm --prefix = nhà cung cấp https://example.com/repo chủ --squash

Có hai cam kết tạo ra. Một cho cây con bị đè nén cam

Squashed 'vendor' changes from 15fc2b6..c6dc29b 

và hợp nhất cam kết

Merge commit 'SHA1' into master 

Khi tôi muốn đẩy sự thay đổi này để Gerrit, nó cần một changeID. Nhưng git không cho phép tôi làm một

git rebase -i HEAD~2

và làm lại như tôi làm cho bất kỳ khác cam kết vì nó là một bị đè nén cam kết.

Bây giờ tôi không thể đẩy thay đổi này thành gerrit vì điều này. Tôi không thể thực hiện các thay đổi đối với người đứng đầu (git) trực tiếp và phá vỡ nội dung trên siêu mô hình. Nó phải trải qua quá trình xây dựng và thử nghiệm. Bất kỳ đề nghị hoặc giúp đỡ được đánh giá cao.

Trả lời

0

git filter-branch có thể thực hiện nhiều việc, đồng thời cập nhật con trỏ cam kết để biểu đồ cam kết vẫn nguyên vẹn. Một trong số đó là chạy một lệnh để chỉnh sửa tất cả các thông báo cam kết, chẳng hạn như móc nối-gặt của Gerrit.

git filter-branch HEAD...HEAD~1 lấy tất cả các cam kết trong HEAD chứ không phải HEAD ~ 1, cho phép hợp nhất git-subtree chỉ là cam kết hợp nhất và bí.

git filter-branch --msg-filter có một lệnh để chạy để nhận thông điệp cam kết được truyền vào stdin và viết một thư mới vào stdout. script hook commit-msg hoạt động trên một file, do đó, một chút kịch bản shell là cần thiết để viết tin nhắn gốc vào một tập tin, chạy hook, và sau đó cat file thành stdout.

Tôi đã đặt tất cả điều này trong một kịch bản để chạy trước khi đẩy để Gerrit:

# 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} 
Các vấn đề liên quan