2014-12-02 16 views
5

Tôi muốn tự động làm sạch các nhánh từ xa. Tôi muốn có thể kiểm tra xem liệu một chi nhánh đã được hợp nhất thành chính chưa. Ban đầu, kế hoạch của tôi là sử dụng git merge-base để xem cam kết chung cuối cùng.Kiểm tra xem chi nhánh Git có được hợp nhất thành chính khi SQUASHED không?

Tuy nhiên, nó chỉ ra rằng chúng tôi squash tất cả các chi nhánh của chúng tôi khi chúng tôi kết hợp chúng thành chủ. Vì điều này tạo ra một băm mới cam kết, tôi không thể tìm thấy các cam kết chung giữa chủ và các nhánh của tôi.

Làm cách nào để xác định xem chi nhánh đã được hợp nhất nếu chúng tôi đã đè bẹp tất cả khi hợp nhất?

Cảm ơn trước!

+0

không chính xác đáng tin cậy nhưng 'git log --grep =" merge $ BRANCH "' hoặc một cái gì đó có thể hoạt động, nếu bạn đặt tên chi nhánh trong thư cam kết khi bạn thực hiện hợp nhất bí. –

+0

Thật không may, chúng tôi không phải lúc nào cũng đặt tên của chi nhánh trong thông điệp cam kết khi chúng tôi thực hiện hợp nhất bí. – emilyxxie

+0

Bạn có đang đạt được điều gì bằng cách đè bẹp? Bạn luôn luôn có thể bí mật thông qua rebase đầu tiên và sau đó làm một hợp nhất bình thường. –

Trả lời

2

Bạn có thể làm một hợp thử nghiệm và kiểm tra xem nó giới thiệu bất kỳ thay đổi, như vậy:

git checkout -b foo-merge-test-branch master 
git merge --squash foo 
if [ -n "$(git status --porcelain)" ]; then 
    echo "foo has not been merged"; 
else 
    echo "foo is already merged"; 
fi 
git reset --hard && git checkout master && git branch -d foo-merge-test-branch 

này sẽ chỉ làm việc nếu không ai trong số các tập tin thay đổi trong bản gốc git merge --squash foo đã thấy những thay đổi hơn nữa mâu thuẫn trên master từ sau đó.

1

Dưới đây là một cách tiếp cận:

  1. Sử dụng API GitHub để có được các HEAD SHA cho tất cả các yêu cầu kéo sáp nhập.
  2. Khớp các SHA này với các chi nhánh địa phương.

Nếu HEAD nhánh của địa phương tương ứng với HEAD của nhánh đã được hợp nhất, bạn có thể xóa nó một cách an toàn. Điều này sẽ làm việc bất kể như thế nào PR được sáp nhập (đầy đủ hợp nhất, nhanh chóng foward, squash và hợp nhất).

Tôi đã triển khai phương pháp này trong tập lệnh delete-squashed-branches. Đây là những gì sử dụng trông giống như:

(master) $ git branch 
    delete-merged-prs 
    fixup 
    unmerged-branch 
* master 

(master) $ delete-squashed-branches 
Finding local branches which were merged onto origin/master via GitHub... 
warning: deleting branch 'delete-merged-prs' that has been merged to 
    'refs/remotes/origin/delete-merged-prs', but not yet merged to HEAD. 
Deleted branch delete-merged-prs (was 325a42b). 
warning: deleting branch 'fixup' that has been merged to 
    'refs/remotes/origin/fixup', but not yet merged to HEAD. 
Deleted branch fixup (was e54f54b). 

(master) $ git branch 
    unmerged-branch 
* master 

(. Những cảnh báo có thể được bỏ qua kể từ khi chi nhánh đã được sáp nhập vào tổng thể qua Squash & Merge)

Hãy cẩn thận:

  • Bạn sẽ cần phải pip install pygithub để sử dụng tập lệnh.
  • Nó sẽ tìm kiếm các chi nhánh địa phương được sáp nhập vào origin/(current branch). Vì vậy, bạn sẽ muốn chạy nó trên master, develop hoặc bất kỳ chi nhánh nào bạn làm việc.
  • Nếu bạn có nhiều nhánh sống lâu, phương pháp này sẽ không hoạt động tốt.
Các vấn đề liên quan