2009-04-17 48 views
9

Tôi đang sử dụng Git-Svn để tương tác với kho Svn tại nơi làm việc và dường như tôi không thể tìm cách giải quyết xung đột hiệu quả cho cuộc sống của tôi. Tôi đã đọc các câu hỏi khác về chủ đề này, nhưng rõ ràng tôi cần một cái gì đó thậm chí còn khắc phục nhiều hơn bởi vì tôi luôn luôn dường như kết thúc trong một số loại vòng lặp vô tận. Tôi rebase, sử dụng mergetool (meld) để giải quyết xung đột của tôi và, khi tôi nhận được đến cuối tất cả những điều đó, tôi cố gắng làm một dcommit và tôi nhận được một cuộc xung đột hợp nhất trong lỗi cam kết.Giải quyết các xung đột Git Svn

Tôi biết điều này giống như một bản sao, nhưng sự thất vọng khiến tôi hỏi lại, với một số chi tiết rất cụ thể về cách tôi sẽ thực hiện điều này để hy vọng ai đó có thể cho tôi biết chính xác quy trình của tôi bị hỏng.

thiết lập của tôi:

Tôi có một chi nhánh ở xa (svn/trunk), một chi nhánh địa phương (thân cây) và một chi nhánh địa phương mà tôi thường làm việc trong (làm việc-cốp). thân cây đã được kiểm tra từ svn/thân cây và thân cây làm việc đã được kiểm tra ra từ thân cây.

Dưới đây là những gì tôi đã làm:

  1. On thân của tôi, git svn rebase (trả về xung đột)
  2. git mergetool
  3. [giải quyết xung đột cho tập tin đó]
  4. Lưu tập tin sáp nhập từ meld và đóng meld.
  5. git add .
  6. git rebase --continue
  7. [rửa, lặp lại]
  8. Nếu tôi nhận được một thông báo hỏi tôi đã sử dụng git add, tôi git rebase --skip

Khi tôi nhận được để kết thúc tất cả những thay đổi được báo cáo, tất cả mọi thứ chỉ là loại dừng lại và tôi đoán có lẽ tôi không chắc chắn phải làm gì vào thời điểm này. Git cho thấy không có gì để được cam kết và tôi dường như trở lại trên thân cây. Git sau đó cho phép tôi dcommit, nhưng nếu tôi cố gắng một rebase ngay sau đó, tôi kết thúc lại giải quyết các cuộc xung đột tôi chỉ giải quyết.

Rõ ràng là một phần quan trọng tôi đang thiếu ở đây, nhưng tôi chỉ không nhìn thấy nó và nó gây ra rất nhiều vấn đề và thất vọng. Sáp nhập có thể dễ dàng trong Git, nhưng tôi chắc chắn không tìm được điều đó.

Cảm ơn.

CẬP NHẬT: Chỉ muốn đưa ra bản cập nhật nhanh để mô tả quy trình làm việc của tôi trong trường hợp đó là một phần (hoặc tất cả) của sự cố.

Để bắt đầu, sau khi nhân bản kho lưu trữ của tôi với tiền tố svn/, tôi có chi nhánh từ xa svn/trunk từ xa của mình. Cho rằng:

  1. I git co -b trunk svn/trunk để kiểm tra điều khiển từ xa của tôi với chi nhánh địa phương.
  2. I git co -b working-trunk để tạo một nhánh đang hoạt động mà tôi sử dụng để tạo thêm một mức phân tách sao cho địa chỉ nội bộ của tôi luôn có thể phản chiếu thân từ xa của tôi.
  3. Tôi xóa chi nhánh chính mặc định (khi làm việc với svn, tôi thấy dễ nghĩ hơn về "thân cây" hơn là "chính").

Khi tôi có tất cả các chi nhánh của tôi, công việc điển hình của tôi trông như thế này:

  1. On lao động thân, tôi thực hiện thay đổi của tôi và cam kết họ.
  2. I git co trunk và thực hiện git svn rebase.
  3. Giả sử mã mới đã được rebased, I git rebase working-trunk.
  4. git co working-trunk
  5. git merge trunk
  6. git rebase trunk
  7. git co trunk
  8. git merge working-trunk
  9. git svn dcommit

Đó là một rất nhiều bước, tôi biết, nhưng đó là những gì mọi người ở đây và các nơi khác đã khuyến khích. Có thể lỗ hổng chết người của tôi ở đâu đó trong quá trình đó?

Xin cảm ơn một lần nữa.

+1

Đã trả lời bạn chọn (Jistin) giải quyết vấn đề? – inger

Trả lời

5

Tôi muốn đề xuất sử dụng git rebase thay vì git merge. Svn giữ một lịch sử tuyến tính và có vẻ như bị lẫn lộn với việc gộp các nhánh git đôi khi. Sử dụng git rebase đảm bảo một lịch sử tuyến tính svn hiểu được.

xem: http://learn.github.com/p/git-svn.html để biết thêm thông tin và nguyên tắc.

1

Tôi đã thử điều này với một xung đột nhỏ (tôi phải thừa nhận) mà tôi đã buộc và sau git svn dcommit Tôi không còn xung đột nào nữa. Một điểm khác biệt là tôi không nhận được thông báo về số git add. Có thể nhóm của bạn đang gửi rất nhiều cam kết xảy ra xung đột với công việc của bạn không? Có vẻ như không, nhưng nó có vẻ là giải thích đơn giản nhất. Bạn có thể phải dành thời gian để lấy lại repo ở một vị trí khác và kiểm tra xem bạn có thể đẩy các thay đổi không xung đột để đảm bảo không có vấn đề về giao tiếp trong giai đoạn dcommit đang bị ẩn đi bằng cách nào đó.

CẬP NHẬT: Một ý nghĩ khác tôi đã có: Tôi đã thực hiện một git add foo.bar khi tôi hoàn tất giải quyết xung đột. Có phải là sở hữu rằng git add . đang làm điều gì đó không mong muốn? Tôi không thực sự kéo dài khả năng của git svn tất cả những gì nhiều, vì vậy đây là khá nhiều WAG.

+0

Nó cũng có thể là tôi quá cẩu thả với cách tôi xử lý kho lưu trữ của tôi, nhưng tôi không chắc chắn làm thế nào/tại sao đó sẽ là. Tôi đã chạy vào điều này nhiều lần và đã kết thúc hoàn toàn giết chết và xây dựng lại repos của tôi mỗi lần. Hugely bực bội. Cảm ơn những suy nghĩ của bạn. –

1

Có vẻ như có điều gì đó không hoạt động theo cách bạn nghĩ. Nếu đó không phải là những điều không chắc chắn mà Hank Gay đề nghị, thì đó là một điều không chắc chắn khác.

Khả năng không chắc chắn của tôi là cấu trúc chi nhánh của bạn không phải là suy nghĩ của bạn hoặc bạn không phải rebasing trên chi nhánh mà bạn nghĩ bạn đang có. Vì vậy, tôi đề nghị bạn nên:

  1. git branch chỉ để xác nhận cấu trúc chi nhánh của bạn là những gì bạn mong đợi

  2. Thêm
    export PS1='\e[0;31m\n\w$(__git_ps1 "(%s)") $ \e[m'
    tới ~ /.bash_profile và đăng nhập lại,
    để hiển thị các chi nhánh (và bất kỳ lệnh git trong tiến trình) tại dấu nhắc của bạn:

    /workspace/wikka (featurebranch1 | rebase-i) $

Điều đó sẽ cung cấp cho bạn phản hồi nhiều hơn (và có thể loại bỏ WAG này là một khả năng).

0

Tôi khuyên bạn chỉ nên sử dụng git-svn giữa thân cây địa phương và thân từ xa trunk của mình. Giữa số điện thoại tại địa phương của bạn và địa phương mytrunk, chỉ tuân theo các tính năng chính của git. Bạn có thể có thể thử một luồng công việc như thế này:

[SVN]---git-svn---[trunk]---branch---[mytrunk] 

Để hợp nhất, chuyển sang thân và làm một:

git svn rebase 

này kéo những thay đổi từ điều khiển từ xa và kết hợp nó với thân . Sau đó, chuyển sang mytrunk và làm một:

git rebase 

này kéo những thay đổi từ thân và kết hợp nó với mytrunk. Tôi nghĩ rằng nó sẽ hoạt động. Nếu không, chỉ cần git-clone trunk nội bộ và làm việc trên clone để thay thế.

+0

Điều đó nghe giống như những gì tôi làm, nếu tôi hiểu chính xác bạn. Tôi sẽ cập nhật câu hỏi ban đầu của mình với quy trình làm việc của mình. –

0

Tôi vừa gặp sự cố này khi sử dụng quy trình làm việc được đề xuất, vì vậy tôi nghĩ chúng tôi thiếu câu trả lời ở đây.

Đây là cách tôi gặp phải tình huống này.

Tôi có git repo qua git svn, sử dụng cơ sở hạ tầng Apache.

Tôi có chi nhánh địa phương.

Tôi cố gắng làm theo quy trình này:

1) rebase trunk. 2) hợp nhất thân cây thành chi nhánh tư nhân. 3) làm việc. 4) rebase trunk. 5) hợp nhất riêng tư vào thân cây. 6) dcommit.

Tuy nhiên, tôi đã sai lầm và tôi đã quên đẩy thay đổi từ riêng tư sang thân cây. Sau đó tôi đã thực hiện một loạt các thay đổi khác cho nhánh tư nhân của tôi và kết thúc trong vòng lặp súc sắc và lặp lại trên một cuộc xung đột hoàn toàn giả mạo. Thay đổi cuối cùng tôi đã đẩy lên là để bình luận ra một dòng duy nhất. Khi tôi sau đó xóa dòng đó trong sự thay đổi bị bỏ quên, nó tạo ra xung đột sẽ không giải quyết được, cho dù thế nào đi chăng nữa. Cuối cùng tôi đã sử dụng --skip trên đó.

1

Người ta có thể tìm thấy SubGit 's tiếp cận dễ dàng hơn một chút:

  1. Install SubGit vào kho lưu trữ Subversion trên phía máy chủ
  2. Sử dụng git không git-svn gửi thay đổi cho kho SVN *

Cài đặt SubGit tạo ra một đối tác Git của kho SVN. Sao chép kho lưu trữ này vào kho lưu trữ cục bộ của bạn; tạo bất kỳ nhánh nào và đẩy chúng vào kho lưu trữ Git từ xa, SubGit sẽ tự động chuyển đổi các nhánh này thành SVN.

Để biết thêm chi tiết, vui lòng tham khảo SubGit documentationgit-svn comparison.

* Làm việc với bất kỳ ứng dụng khách Git nào.

3

Tôi đã kết thúc trong việc có cùng một vấn đề (git svn rebase trả về xung đột). Tôi đã phát hiện ra sự cố trong luồng công việc của mình. Đây là công việc I/bạn nên làm theo:

git svn rebase # put all the new commits on top 

git svn dcommit # push the new commits to svn (will rewrite each commit message to add the svn tag) 

git pull # merge the conflicts due to the commit messages 

git push # push the synchronized version to the remote git server 

Bất cứ khi nào tôi quên sáp nhập lịch sử sau dcommit, tôi có mâu thuẫn (giả) mới xuất hiện nếu tôi làm cam kết mới. Để giải quyết chúng, bạn có thể thực hiện theo cách tiếp cận bạn đã mô tả ở trên hoặc nếu vấn đề chính xác giống như tôi, bạn cũng có thể thực hiện theo cách tự động bằng cách sử dụng:

git svn rebase --strategy ours 
+0

Thực ra, tôi đã gặp phải một số vấn đề với chiến lược 'của chúng ta'. Dường như bỏ qua các cam kết mới. Bây giờ, tôi chỉ cần chạy 'git rebase --skip 'cho đến khi nó ngừng phàn nàn. – user1448926

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