2012-03-08 26 views
9

Tôi đã sử dụng phần mở rộng git subtree (https://github.com/apenwarr/git-subtree). tôi sử dụng "--squash" để làm cho các bản ghi của dự án chính trong sạch, các bước của tôi như thế này:git-subtree push --quá trình cần một thời gian dài, và nó nhận được lâu hơn theo thời gian với nhiều cam kết

  1. thêm lib vào dự án chính

    git subtree thêm phụ -P/libdir --squash lib_remote nắm vững

  2. get update từ lib

    git subtree kéo -P sub/libdir --squash lib_remote chủ

  3. thay đổi push to lib_remote

    git push subtree -P sub/libdir --squash lib_remote chủ

Nó hoạt động rất tốt đối với tôi (cả hai dự án chính và lib, có một lịch sử có ý nghĩa tốt). Vấn đề là thời điểm git subtree push, trở nên lâu hơn và lâu hơn.

Mục đích của tôi sử dụng git-cây con là gần như giống với Screndib, người yêu cầu git-subtree is not retaining history so I cannot push subtree changes, how can I fix this/avoid this issue in the future?

Tôi đoán, khi sử dụng --squash, mỗi thời gian để xử lý một sự thúc đẩy, git cây con cần để tìm kiếm trên toàn bộ lịch sử kể từ khi "thêm subtree".

Làm cách nào tôi có thể giảm thời gian đẩy subtree? Hoặc làm cho nó hoạt động hiệu quả hơn, chứ không phải toàn bộ lịch sử, chỉ xử lý các thay đổi kể từ lần cuối git subtree push (hoặc pull)?

+0

Lưu ý: như [được đề cập ở đây] (http://stackoverflow.com/a/30441980/6309) (Git 2.5+, Q2 2015), '--squash' không có sẵn cho 'git subtree push' – VonC

Trả lời

2

Tôi giả sử "lib_remote" trong mã của bạn menas url của repo lib từ xa không phải là chi nhánh trong repo hiện tại của bạn? Cả url repo từ xa và nhánh trong repo hiện tại của bạn đang hoạt động.

Tôi thấy bạn đang sử dụng git subtree add để thêm lib từ xa làm cây con và sau đó bạn chỉ cần sử dụng git subtree push để đẩy các thay đổi. Tốt hơn là hãy thực hiện thao tác git subtree split để chia các thay đổi subtree thành một nhánh riêng biệt trong repo curent của bạn trước khi thao tác đẩy, sau đó đẩy chi nhánh được tách ra tới repo từ xa và giữ nhánh này tách ra, mỗi lần trước đẩy, làm một hoạt động git subtree split một lần nữa, điều này sẽ xây dựng lịch sử của hình thức subtree điểm bạn cuối cùng tách ra, nó sẽ nhanh hơn nhiều. Nếu không, nếu không có sự phân chia này giống như bạn đã làm, git subtreee phải xây dựng lịch sử của subree từ điểm bạn đã thêm, miễn là cây con cam kết phát triển, thời gian của tòa nhà sẽ lâu hơn và lâu hơn.

Nếu bạn không sử dụng --squash trong khi thêm, bạn có thể xem xét sử dụng --rejoin trong khi bạn tách, điều này sẽ nhanh hơn nhiều.

Vì vậy, bước phải như sau.

  1. thêm lib vào dự án chính

    git subtree thêm -P sub/libdir --squash lib_remote_url chủ

  2. get update từ lib

    git subtree kéo -P sub/libdir --squash lib_remote_url master

  3. chia các thay đổi phụ thành một chi nhánh riêng biệt

    git subtree chia -P sub/libdir -b lib_remote_branch

  4. đẩy thay đổi lib_remote

    git push lib_remote_url lib_remote_branch: thạc sĩ

Giữ lib_remote_branch tồn tại và thực hiện lại các bước 3 và bước 4 khi lần đẩy tiếp theo.

+0

Cảm ơn sự chú ý, nhưng tôi đã không làm cho nó hoạt động được. Đây là vấn đề: làm bước 3 và bước 4, có một số cam kết khác, sau đó thực hiện lại bước 3. Thời gian vẫn còn lâu hơn. Ngay cả sau khi chia tay, cây con dường như vẫn xử lý toàn bộ lịch sử kể từ khi "thêm". Sử dụng - thay vào đó thay vì --squash, thao tác này sẽ hoạt động. Nhưng tôi thực sự không muốn toàn bộ lịch sử của sublib sáp nhập vào dự án chính, điều đó sẽ làm cho nó là rất khó để có được bất kỳ sence ra từ gitk của dự án chính. Tôi làm theo các bước chính xác như mô tả của bạn, tôi có thể làm sai không? – Megodno

+0

Tôi gặp vấn đề tương tự! –

+0

lưu trữ nó trong một chi nhánh riêng biệt sẽ không khắc phục được vấn đề ở tất cả – owagh

1

Vấn đề chính là với các cam kết mới trên các tiền tố khác nhau kể từ khi bạn thêm lần đầu tiên. Giải pháp của tôi cho vấn đề này là thực hiện một hoạt động "dọn sạch", nơi bạn lọc tất cả các thay đổi của bạn mà không có trong kho khác và sau đó làm một git subtree thêm vào nhánh mới này.

Đây là một cách khá thô bạo để làm điều đó nhưng về cơ bản nó giống như nói rằng làm một "git subtree thêm" trên bản sao mới của kho lưu trữ chính của bạn. Đó là điều duy nhất làm việc cho tôi ...

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