2012-04-10 37 views
10

Phần tóm tắt dưới đây: Tôi muốn đẩy thư cam kết tới cây con, nhưng chỉ các thư áp dụng cho cây đó. Làm thế nào để tôi làm điều này?git subtree đẩy các thay đổi về dự án subtree


Tôi có hai dự án, MasterSlave. Slave được kiểm tra như một cây con của Master kiểm tra ra để lib/slave qua git subtree merge --prefix=lib/slave --squash projects/slave nơi projects/slave là một chi nhánh Slave được kiểm tra ra vào:

Chi nhánh:

chủ dự án/slave → nô lệ

Bây giờ tôi đang làm việc trên chi nhánh master của tôi, thực hiện cam kết các tệp là một phần của cả hai dự án, mọi thứ diễn ra suôn sẻ. Bây giờ tôi muốn đẩy những thay đổi về Slave:

  • git checkout nô lệ
  • git merge ??? master

Nếu tôi kết hợp bình thường, tôi nhận được cam kết cho mọi cam kết làm chủ, có hoặc không có bất kỳ tệp nào trong lib/slave được sửa đổi. Hoặc tôi có thể làm một số --squash và chỉ nhận được một cam kết duy nhất, nhưng tôi mất các thông điệp tường trình.

Vậy làm cách nào để nhận được thông báo nhật ký thích hợp? ví dụ. nếu lịch sử đăng nhập master của tôi là:

  • thêm hình ảnh để làm chủ
  • file sửa đổi trong nô lệ chỉ
  • nhiều thay đổi để làm chủ chỉ
  • file sửa đổi trong master và slave

tôi d muốn điều này được thêm vào Slave:

  • file sửa đổi trong nô lệ chỉ
  • file sửa đổi trong master và slave
+0

Gitslave (http://gitslave.sourceforge.net/) có thể là một thay thế thú vị trong trường hợp của bạn. – VonC

+0

@VonC - Một trong những vấn đề chính tôi thấy với gitslave là nó có vẻ như là lệnh fork cho mỗi repo, thực hiện một cách hiệu quả 'git commit -m" commit message "' trên mỗi repo.Vì vậy, nếu bất kỳ nhà phát triển nào không sử dụng nó, chúng tôi sẽ gặp sự cố đồng bộ hóa, đúng không? –

+0

Có thể là câu hỏi ngu ngốc nhất trên thế giới, nhưng tại sao không phải là 'git log 'đủ ở đây? Điều đó sẽ chỉ cung cấp cho bạn những thay đổi phù hợp với nhánh nô lệ của bạn khi bạn phát hành nó qua các thư mục của bạn. Là nỗi đau của bạn trong sự thay đổi lộn xộn, hoặc là nó chỉ trong màn hình? – MrGomez

Trả lời

6

Đối với hành vi mà bạn muốn, tôi nghĩ rằng bạn sẽ phải đẩy từ Master, tôi không biết một cách để kéo thay đổi cây con từ Slave.

Để đẩy thay đổi:

(in Master) 
$ git subtree split --prefix=lib/slave -b split-branch 
$ git push <bare Slave repo> split-branch:master 
$ git branch -d split-branch 
$ cd /path/to/Slave/working/copy 
$ git pull # (now in Slave) 

Lệnh đầu tiên tạo ra một cây con mới dựa trên các thư mục, sau đó được đẩy lên dự án khác.

Về lý thuyết, bạn có thể đẩy trực tiếp lên bản sao làm việc, nhưng trong thực tế không hiệu quả với tôi.

+0

Tôi không chắc tại sao bạn không hiển thị lệnh 'git subtree push', nhưng sau đó tôi nhận ra (từ tài liệu git subtree) rằng một cây con đẩy chỉ là một phân chia subtree theo sau là một đẩy thường xuyên đến kho lưu trữ thay thế. – yoyo

Các vấn đề liên quan