2012-03-19 32 views
15

Chúng tôi đã cố gắng để có được git-subtree làm việc trên một dự án (với phiên bản git 1.7.9.4) và đã chạy vào một chút của một biến chứng. Một người nào khác trước thêm cây con bằng lệnh này vài tháng trước:biến chứng kéo git-subtree

git subtree add --prefix=foo [email protected]:foo.git master 

Bây giờ đã có thay đổi đáng kể để foo và chúng tôi muốn hợp nhất trong những thay đổi đó, tốt nhất là đè bẹp chúng trong Không ai trong số các tập tin có được. đã được sửa đổi vì chúng đã được nhập.

Tôi đã thử ba điều để thử và hợp nhất trong các thay đổi.

Đầu tiên:

git subtree pull --squash -P foo [email protected]:foo.git master 

nào ném ngoại lệ: Can't squash-merge: 'foo' was never added.

Thứ hai:

git subtree pull -P foo [email protected]:foo.git master 

này hoạt động (loại), nhưng có vấn đề kéo trong tất cả các cam kết và có xung đột với các tệp đã được sửa đổi.

Cuối cùng, tôi đã cố gắng này:

git pull --squash -s subtree [email protected]:foo.git master 

này mang lại cho tôi những kết quả mong muốn, với sản lượng Automatic merge went well; stopped before committing as requested và tất cả các tập tin hiển thị như sửa đổi (với các nội dung chính xác).

Lý tưởng nhất là tôi muốn tiếp tục sử dụng phiên bản git-subtree đầu tiên và nhận được kết quả gần với phiên bản cuối cùng. Nếu chúng ta phải sử dụng phiên bản cuối cùng liên tục, chúng tôi sẽ, nhưng tôi hơi bối rối là tại sao người cuối cùng không tạo ra xung đột hợp nhất trong khi phiên bản trung gian thực hiện.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

6

Tôi đã có cùng một vấn đề, và trong trường hợp của tôi có vẻ như là do cam kết ban đầu subtree được hợp nhất-squashed vào master branch.

Nhìn qua các nguồn cây con Tôi thấy điều này: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh#L224

Dường như cây con greps git log của bạn cho git-subtree-dir: foo nhưng không tìm thấy một cam kết phù hợp. Hãy thử git log --grep="git-subtree-dir: foo/*\$" và nếu có điều gì đó lạ với cam kết đó, chẳng hạn như cam kết hợp nhất, điều đó có thể là vấn đề.

Chỉ cần kéo mà không bị đập làm việc cho tôi, ngoài các xung đột hợp nhất gây phiền nhiễu. Tôi đã làm điều đó trong một chi nhánh tạm thời mà sau đó tôi git merge --squash được chuyển thành một chi nhánh khác để tránh lịch sử lộn xộn hơn. Nó có thể đã được rebased thay vì quá tất nhiên.

+1

Tôi đã gặp phải vấn đề tương tự như đã được gây ra bởi tôi thiếu một thư mục con trong tùy chọn tiền tố khi cố gắng kéo. Thêm điều này làm nhận xét vì thông báo lỗi không đưa ra bất kỳ dấu hiệu nào về lỗi này và khắc phục sự cố đã dẫn tôi đến đây. –

+0

Cảm ơn, điều này rất hữu ích. Tôi đã có một vấn đề liên quan, nơi tôi di chuyển subdir sau khi thêm subtree vào nó, mà dường như để đi lên trận đấu này –

1

Tôi đã gặp lỗi giống nhau Can't squash-merge: 'foo' was never added. với sourcetree 1.7.0 bất cứ khi nào tôi thực hiện thao tác trên cây con. Tuy nhiên, tôi tin rằng trường hợp của tôi khác biệt vì tôi đang sử dụng các thư mục con.

Sourcetree làm điều gì đó như sau:
git -c diff.mnemonicprefix=false -c core.quotepath=false subtree pull -P dir1\subdir1 --squash remote-repo master

Và rõ ràng, nếu chúng ta thử nó một lần nữa trong Git Bash (Git phiên bản 2.6.1.windows.1), nó sẽ là:
git subtree pull -P "dir1\subdir1" --squash remote-repo master

Tuy nhiên điều đó không thành công. Sau đây cũng thất bại mặc dù cú pháp lệnh là tốt:
git subtree pull -P dir1/subdir1 --squash remote-repo master

các giải pháp tôi tìm thấy để làm cho nó hoạt động là sử dụng Git Bash với lệnh sau đây:
git subtree pull -P "dir1/subdir" --squash remote-repo master

Tôi đoán rằng vẫn còn một số có công việc phải làm cho công cụ xử lý dòng lệnh của Git.

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