2010-03-21 24 views
16

Công ty tôi đang làm việc đang bắt đầu và họ đã thay đổi tên của họ trong quá trình này. Vì vậy, chúng tôi vẫn sử dụng tên gói com.oldname vì chúng tôi sợ phá vỡ lịch sử thay đổi tệp hoặc liên kết tổ tiên giữa các phiên bản hoặc bất kỳ thứ gì chúng tôi có thể phá vỡ (tôi không nghĩ rằng mình sử dụng đúng cụm từ, nhưng bạn có khái niệm).Làm cách nào để đổi tên các gói Java mà không phá vỡ lịch sử Subversion?

Chúng tôi sử dụng: Eclipse, TortoiseSVN, Subversion

tôi thấy somewhere rằng tôi nên làm điều đó trong nhiều bước để ngăn chặn rời rạc giữa nội dung của thư mục svn và tên gói trong file java:

  • Đầu tiên sử dụng TortoiseSVN để đổi tên thư mục, cập nhật thư mục .svn.
  • Sau đó, đổi tên thư mục trở lại tên gốc theo cách thủ công.
  • Để cuối cùng sử dụng Eclipse để đổi tên các gói (refactor) trở lại tên mới, cập nhật các tệp java.

Điều đó có vẻ tốt với tôi, nhưng tôi cần biết liệu tổ tiên và lịch sử và mọi thứ khác sẽ vẫn mạch lạc và hoạt động tốt.

Tôi không có chìa khóa cho máy chủ đó, đó là lý do tại sao tôi không vội vàng sao lưu mọi thứ và thử một hoặc hai thứ. Tôi muốn đưa ra một lý do chính đáng để không làm điều đó, hoặc một cách để thực hiện nó.

Cảm ơn bạn đã giúp đỡ của bạn,

M. Joanis


Package đổi tên thử nghiệm

Thủ tục:

  1. Tạo một com.oldname.test gói mới .renametest.subpackage.
  2. Thêm một lớp mới dưới renametest gọi RenameTest0.java và chứa:

    class RenameTest0 { 
        public RenameTest0() { 
         showMessage(); 
         new RenameTest1(); 
        } 
        public static void showMessage() { 
         System.out.println("RenameTest0!"); 
        } 
        public static void main(String[] args) { 
         new RenameTest0(); 
        } 
    }
  3. Thêm một lớp mới dưới renametest.subpackage chứa:

    class RenameTest1 { 
        public RenameTest1() { 
         showMessage(); 
         RenameTest0.showMessage(); 
        } 
        public static void showMessage() { 
         System.out.println("RenameTest1!"); 
        } 
    }
  4. Kiểm tra rằng RenameTest0 chạy tốt.

  5. Cam kết.
  6. Thay đổi thông báo của cả hai lớp.
  7. Cam kết.
  8. Một lần nữa, thay đổi thông điệp của một lớp và cam kết (chỉ cần tạo một số lịch sử).
  9. Áp dụng thủ tục được đề xuất ở trên (ba bước trong thư gốc) để đổi tên gói renametest thành testrename.
  10. Cam kết.
  11. Chạy thử nghiệm.
  12. Sửa đổi lại thư và kiểm tra.
  13. Cam kết.
  14. Cố gắng quay lại phiên bản khi cả hai tin nhắn đã được thay đổi đồng thời lần đầu tiên.
  15. Nếu mọi thứ hoạt động tốt đến thời điểm này, có vẻ tốt, phải không?

Kết quả kiểm tra:

  • Lưu ý về bước 9: Đã phải làm điều đó trong thứ tự ngược (Eclipse đổi tên THEN TortoiseSVN đổi tên.), Ngược lại nó đã bị phức tạp, như TSVN tạo mới thư mục/gói và đánh dấu cũ để xóa ... Vì vậy, bạn không thể đổi tên cho Eclipse trừ khi bạn đặt gói cũ ở một nơi khác trong thời gian chờ đợi để ngăn chặn mất thư mục .svn, v.v ... Không giống như một tốt ý tưởng để đi xa hơn với phương pháp này. (Lưu ý cho chính mình: đừng quên đánh dấu vào hộp kiểm để đổi tên gói đệ quy!)
  • Lưu ý ở bước 14: Đã làm việc! Chúng ta có thể thấy các phiên bản trước; tất cả những gì chúng ta phải làm là bảo không được sao chép/di chuyển và không sao cả. Sau khi hoàn nguyên về phiên bản trước khi đổi tên, tên gói không quay trở lại tên tốt mặc dù, có lẽ việc tái cấu trúc lại nó sẽ làm điều đó.
  • Lưu ý cuối cùng: Tôi rất ngạc nhiên khi phải thực hiện các bước quan trọng theo thứ tự ngược lại. Để thực hiện điều đó ngay giữa lần đổi tên gói đầu tiên này, tôi đã phải khôi phục một số thay đổi TSVN và thủ công, đúc một chút nghi ngờ về bản chất lặp lại của kết quả chính xác của quy trình này. Tôi sẽ phải làm một bài kiểm tra thứ hai để xác nhận tính hợp lệ của nó. Tóm lại: có vẻ tốt, nhưng cần thử nghiệm thêm.
+5

Lý do chính đáng để không làm là sẽ là số lượng công việc tốt (kể cả thử nghiệm) không có lợi ích. Nếu bạn nghĩ ai đó sẽ bắt đầu sản xuất thư viện trong không gian com.oldname sẽ va chạm với bạn, nó có thể đáng giá, nhưng toàn bộ ý tưởng về tiền tố miền là để đảm bảo tính duy nhất, không thỏa mãn dân gian tiếp thị. – msw

+0

Tôi phải thừa nhận đó là một điểm rất tốt ... – Joanis

+0

@Don Kirby & @Karussell: Tôi sẽ cố gắng chạy thử nghiệm hôm nay hoặc ngày mai và sẽ đưa ra phản hồi về điều đó tại đây. – Joanis

Trả lời

8

Có lẽ nó không thực tế cho các nhu cầu chính xác của bạn nhưng TortoiseSVN có một tính năng tiện dụng về đổi tên. Bạn có thể làm điều này:

  1. Sử dụng tính năng tái cấu trúc của IDE để đổi tên nội dung.
  2. Khởi chạy hộp thoại "Kiểm tra sửa đổi" từ TortoiseSVN.
  3. Đối với mỗi mục được đổi tên, bạn sẽ thấy hai mục nhập: một mục "source.java" bị thiếu và mục "target.java" không phiên bản. Đánh dấu cả hai và chọn "Sửa chữa di chuyển" từ trình đơn ngữ cảnh.

Repair moves/renames

+0

Liên kết này bị hỏng – naumcho

+0

Nhưng điều này sẽ không hoạt động nếu bạn cũng có một plugin Eclipse SVN được cài đặt như Subclipse, phải không? – User

0

Có, nó sẽ hoạt động. Bạn có thể cài đặt phiên bản dòng lệnh của svn và viết một tập tin thực thi sẽ làm công cụ svn. Tự động hóa các công cụ nhật thực sẽ có nhiều công việc hơn một chút và có thể không đáng giá nếu bạn chưa quen với API nhật thực.

Kiểm tra nó bằng một gói trước khi bạn thực hiện mọi thứ chỉ để đảm bảo bạn đang thực hiện tất cả các bước ngay.

2

Bạn có chắc chắn rằng lịch sử không hoạt động nếu bạn đang sử dụng phương pháp tái cấu trúc được bao gồm trong nhật thực?

Với NetNeans, tôi thường xuyên thay đổi tên gói và plugin svn cơ bản 'sẽ lặng lẽ di chuyển nội dung (lưu lịch sử) vào thư mục mới (sau đó việc tái cấu trúc bình thường sẽ xảy ra).

vì vậy: Bạn đã thử nó từ trong nhật thực nếu lịch sử được giữ với plugin subversion? (Ví dụ như trong một bản sao trả phòng tươi để tránh thất bại)

Ít nhất bạn có thể sử dụng NetBeans để làm nhiệm vụ một lần này ...

+0

+1: ngay cả câu hỏi là dành cho nhật thực, điều này giúp tôi rất nhiều. plugin netbeans hoạt động tốt cho tôi.(chỉ cần cập nhật thông tin với PLUGIN và không phải với một khách hàng svn khác trước khi thực hiện refactor) – Loda

0

Bạn thể làm điều này, và nó không phải là khó khăn - đặt cược tốt nhất của bạn để có được một lịch sử SVN sạch sẽ là để làm điều đó trong 2 bước (có thể trở thành một cam kết) - mặc dù cho kết quả tốt, tôi khuyên bạn nên sử dụng khách hàng CLI.

  1. Sử dụng svn mv để di chuyển các thư mục/gói
  2. Go vào Eclipse, hoặc sử dụng grep từ CLI để sửa chữa các gói trong các tập tin để phù hợp với tên mới

Sau đó, bạn có thể cam kết dưới dạng tập hợp thay đổi và lịch sử ở cấp tệp phải khớp nhau.

Nếu bạn đang sử dụng Maven hoặc một công cụ đóng gói, khuyên bạn nên chạy một phiên bản trước khi làm một cái gì đó như thế này - cũng nó có giá trị cắt một thẻ ngay lập tức trước khi điều này trong trường hợp bạn cần phải quay trở lại với cấu trúc cũ

0

tôi phát hiện ra rằng các plugin subclipse cung cấp cho các thông báo lỗi "là đã dưới sự kiểm soát phiên bản" khi cam kết một lớp học mà đã được chuyển đến một gói phần mềm mới (tức là không thuộc quyền kiểm soát nguồn nào) và phụ huynh của gói này cũng mới.

Khi điều này xảy ra, tôi có thể cam kết các thay đổi bằng TortoiseSVN. Sau đó tôi chỉ cần làm mới dự án trong Eclipse.

Sau khi di chuyển một lớp học sang gói mới có cha mẹ đã được kiểm soát nguồn, subclipse có thể cam kết thay đổi này mà không có vấn đề.

0

Thay vì đổi tên gói bạn có thể làm điều này:

  1. tạo cấu trúc gói mới trong dự án của bạn. Sau khi thực hiện dự án của bạn sẽ giống như thế này:

     com - 
          |- myOLDcompname - 
          |    |- feature1 - 
          |       |- classA.java 
          |       |- classB.java 
          |- myNEWcompname - 
              |- feature1 
    
  2. thêm thư mục mới dưới sự kiểm soát phiên bản để svn có thể theo dõi chúng

  3. di chuyển các lớp học java của bạn từ các gói cũ sang mới. Eclipse nên cập nhật tất cả các lớp nhập khẩu và khai báo gói phù hợp. Quan trọng nhất là vì các gói cũ và mới dưới vcs bước này nên giữ lịch sử của các lớp.
  4. khi hoàn thành xóa các thư mục cũ
  5. cam kết!
Các vấn đề liên quan