2012-10-19 22 views
8

Tôi đang sử dụng git-subtree của Avery Pennarun, một phần mở rộng cho git.Làm cách nào để chuyển đến cam kết cụ thể bằng git-subtree?

Làm cách nào để tôi chọn cam kết từ một repo phụ vào repo chính của tôi bằng cách sử dụng git subtree? Ngoài ra làm thế nào để tôi đi đến một cam kết cụ thể trong lịch sử của sub-repo sau khi tôi đã thực hiện một git subtree kéo trên tiền tố đó?

Tôi chủ yếu chạy điều này trong chế độ cam kết bóng quần.

Trả lời

5

làm cách nào để chuyển đến một cam kết cụ thể trong lịch sử của phụ repo?

Nếu bạn đã đè bẹp các cam kết, thì không có cách nào, vì squash thua các cam kết khác nhau.

Nếu không, với một cây con không bị đè bẹp, bạn có thể điều hướng đến bất kỳ cam kết nào của cây con với cùng một băm mà nó có trong kho gốc mà từ đó cây con được tạo.

git subtree (không có bí) thực sự thêm vào kho lưu trữ của bạn tất cả các cam kết có liên quan từ kho lưu trữ bên ngoài dưới dạng cây độc lập trong repo hiện tại của bạn. Khi bạn thực hiện một số git subtree add, bạn có thể nhận thấy rằng một số cam kết được thêm vào (tất cả các cam kết ban đầu từ repo bên ngoài) và cam kết hợp nhất cuối cùng di chuyển nội dung từ cây con đó đến thư mục đã cho được chỉ định với tùy chọn --prefix. Tóm lại, nó kiểm tra một chi nhánh từ một kho lưu trữ không liên quan khác và sau đó kết hợp nó vào nhánh hiện tại của bạn bằng cách di chuyển tất cả nội dung đó vào một thư mục con đã cho. Tất cả điều này có nghĩa là lịch sử của repo bên ngoài có sẵn cho bạn, bạn có thể kiểm tra nó giống như vậy, hãy nhớ rằng bằng cách là một cây hoàn toàn khác, thanh toán này có thể sẽ sửa đổi TẤT CẢ nội dung của không gian làm việc của bạn , các dự án lớn có thể kéo dài.

này đưa chúng ta đến thứ hai:

Làm thế nào để anh đào-chọn một cam kết từ một tiểu repo vào repo chính của tôi sử dụng git cây con?

Có vẻ như không có "cherrypicking" hiện tại được hỗ trợ bởi chính mình git subtree. Nhưng với những tác động của tất cả những điều sau đây có thể được thực hiện.

# move yourself to the subtree commit of your choice 
git checkout <subtree-hash> 

# fetch commits from the subtree repository, to have available the commit you want 
# to cherry pick. 
git fetch <path-to-remote> 

# cherry pick the hash you want 
git cherry-pick <cherry-hash> 

# move back to your original branch 
git checkout <your-branch> 

# subtree merge your cherry pick (using the previous HEAD), 
# so that it gets moved to the correct location specified by prefix. 
git subtree merge --prefix <subtree-prefix> [email protected]{1} 

# Since you probably fetched more commits that you needed from 
# the remote, you might want to clean those that where not needed 
git gc 

Đi vào xem xét rằng sau khi làm điều này nếu bạn cố gắng git subtree pull thành cây con của bạn một bản cập nhật, và nó bao gồm các cam kết bạn cherry chọn, bạn sẽ kết thúc với một cuộc xung đột vì bạn sẽ có hai sự thay đổi trong cùng một vị trí .

Một tùy chọn đơn giản hơn, nếu bạn có quyền truy cập vào kho lưu trữ subtree gốc, là chọn anh đào tại đó trong chi nhánh và sau đó chỉ cần git subtree pull nhánh cụ thể đó.

+1

Tôi đã nghiên cứu điều này bằng cách sử dụng 'git phiên bản 1.8.1' đã bao gồm lệnh subtree. – LopSae

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