2008-10-01 34 views
42

Theo the manual, git dcommit "sẽ tạo bản sửa đổi trong SVN cho mỗi cam kết trong git." Nhưng có cách nào để tránh nhiều bản sửa đổi Subversion không? Nghĩa là, để git kết hợp tất cả các thay đổi trước khi thực hiện svn commit?Có thể thực hiện kết quả git svn dcommit trong một cam kết svn không?

+0

Tôi gặp vấn đề tương tự. Hãy tưởng tượng rằng bạn sao chép một repo svn để git làm chủ của bạn, bạn thực hiện 3 cam kết với các thông điệp khác nhau và sau đó sử dụng git svn dcommit. Có thể "hợp nhất" 3 cam kết này trong một đơn lẻ không? Làm thế nào bạn có thể làm điều đó ? Bạn có thể cho chúng tôi một ví dụ ? Thnks! – sergiofbsilva

+0

Có thể trùng lặp của [Kết hợp Git cục bộ cam kết vào một cam kết cho git-svn] (http://stackoverflow.com/questions/1408381/combine-local-git-commits-into-one-commit-for-git-svn) – centic

Trả lời

34

Nếu bạn làm việc trên chi nhánh trong git, bạn có thể git-merge --squash, thực hiện điều đó trong git. Sau đó, bạn có thể đẩy một người bị quăng vào SVN.

Tất nhiên, rất nhiều cam kết nhỏ là tốt, vậy tại sao bạn muốn đánh bóng chúng?

+0

Cảm ơn!(Thông thường tôi sẽ muốn nhiều cam kết nhỏ, nhưng điều này liên quan đến một dự án khách hàng mà tôi và đối tác của tôi cần phải thường xuyên đẩy các thay đổi giữa nhau và thậm chí thay đổi thường xuyên sẽ phá vỡ thân cây.) – plindberg

+0

Tại sao cả hai bạn không làm việc trên cùng một chi nhánh (svn), sau đó? –

+2

Tôi sử dụng nhiều cam kết nhỏ để dễ dàng theo dõi các thay đổi; khi tôi dcommit đến máy chủ svn, chúng tôi tạo ra một email cho mỗi cam kết SVN. Tôi muốn làm công việc phụ của việc sáp nhập trở lại để làm chủ với squash cho "đơn vị hợp lý" cam kết và lưu tất cả mọi người một vài email. – cbowns

27

Lệnh git rebase -i có thể thực hiện việc này và hơn thế nữa. Lệnh này cực kỳ mạnh mẽ, vì vậy rất tốt khi kết bạn với nó.

Cú pháp là: git rebase -i <commit ID>. Điều này sẽ trả về trình soạn thảo văn bản của bạn, với các tùy chọn (và các hướng dẫn) để sửa đổi tất cả các cam kết tối đa (không bao gồm) ID đã cho.

Ví dụ, để thay đổi 5 cam kết trước đó, bạn có thể làm điều này:

git rebase -i HEAD~5

Hoặc nếu chi nhánh SVN của bạn được gọi là "svn/trunk", sau đó cú pháp này là tốt quá:

git rebase -i svn/trunk

Sau đó, cửa sổ soạn thảo văn bản sẽ bật lên. Để squash tất cả mọi thứ, thay đổi từ đầu tiên của mỗi dòng sau khi đầu tiên từ "chọn" để "bí" (Nếu điều này nghe có vẻ khó hiểu - nó sẽ có ý nghĩa hơn khi bạn nhìn thấy nó). Sau đó lưu và đóng trình chỉnh sửa. Sau đó, bạn sẽ có cơ hội chỉnh sửa thông điệp cam kết cho cam kết bị đè bẹp.

Trong số những thứ khác bạn có thể thực hiện với git rebase -i, đang sắp xếp lại các cam kết, cam kết nghiền theo các cách khác nhau và xóa các cam kết.

Tôi sử dụng lệnh này liên tục; đó là một tính năng sát thủ của Git.

7

Ryan Tomayko đã viết một chút về git rebase -i, mà ông nói:

... [đó là] một chút như git commit --amend nhảy lên trên axit và giữ một chainsaw - hoàn toàn mất trí và khá nguy hiểm nhưng có khả năng phơi bày hoàn toàn trạng thái mới của tâm trí. Tại đây, bạn có thể chỉnh sửa, bí, sắp xếp lại, trêu chọc nhau và chú thích các cam kết hiện có theo cách dễ dàng và trực quan hơn nó phải là.

Tôi có một xu hướng để thực hiện thường xuyên trong git, nhưng không nhất thiết muốn dcommit mỗi cam kết svn, và đè bẹp tất cả các công việc của tôi làm chỉ càng ít ý nghĩa. Tôi đang thử nó ngay bây giờ để sắp xếp lại và squash một vài với nhau thành các đơn vị cam kết hợp lý hơn bây giờ.

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