2009-03-26 28 views
26

Tôi có hai xuất khẩu khác nhau của kho CVS của chúng tôi vào git. Họ phân kỳ tại một số điểm, và tôi đang làm một số điều tra tại sao. Dây chuyền phát triển trở lại vài năm và hơn hàng chục nghìn cam kết.Làm cách nào để so sánh hai kho lưu trữ git?

Ở đầu dòng phát triển, ID SHA1 cho mỗi cam kết giống nhau, cho tôi biết git-cvsimport rất nhất quán về những gì nó đang làm khi đọc kết quả của cvsps và nhập.

Nhưng đôi khi giữa lần commit đầu tiên và ngày hôm qua, các ID SHA1 bắt đầu phân kỳ. Tôi muốn tìm hiểu điều này bằng cách so sánh danh sách các ID cam kết từ mỗi kho lưu trữ và tìm xem những gì bị thiếu. Có công cụ hay kỹ thuật nào tốt để làm điều này không?

Trả lời

16

Tại sao không chỉ mèo của mỗi repo git đăng nhập vào tệp riêng của nó và so sánh? Sự khác biệt gần nhất với phần dưới cùng của tệp là nơi họ bắt đầu phân tách ...

+0

Đây thực sự là những gì tôi đã làm hôm qua, mặc dù hôm nay tôi nhận được một chút nâng cao hơn với một số đề xuất từ ​​các câu trả lời khác. – skiphoppy

+3

seing nơi hai kho lưu trữ bắt đầu phân kỳ là một chặng đường dài kể cho tôi những khác biệt đã được tạo ra từ sự phân kỳ đó. – masukomi

+0

Xin lỗi nhưng đó không phải là câu hỏi. Câu hỏi đặt ra là làm thế nào để bạn so sánh hai repos. Trả lời là dưới đây. – awm

6

Cách rõ ràng là sao chép một kho lưu trữ, tìm đầu của nhánh chính của kho lưu trữ khác vào bản sao và sử dụng git merge-base trên hai mẹo để tìm tổ tiên chung.

30

Vì hai kho lưu trữ git bắt đầu giống nhau, bạn có thể kéo cả hai vào cùng một kho lưu trữ.

$ git remote add cvsimport-a git://.../cvsimport-a.git 
$ git remote add cvsimport-b git://.../cvsimport-b.git 
$ git remote update 
$ git log cvsimport-a/master..cvsimport-b/master # in B, not in A? 
$ git log cvsimport-b/master..cvsimport-a/master # in A, not in B? 
+0

Có thể bạn sẽ cần cvsimport-a/master và cvsimport-b/master trong các lệnh đó.Ngoài ra, bạn có thể thực hiện "git remote update" thay vì đường dẫn tới xargs git fetch. –

+0

Tôi ban đầu sẽ viết 'git remote fetch cvsimport-a; git remote fetch cvsimport-b' (không cập nhật bất kỳ điều khiển từ xa nào khác), nhưng sau đó tôi đã thay đổi ý định ... xong. Git than phiền một chút nếu bạn rời khỏi/master nhưng nó hoạt động. Tôi sẽ thay đổi nó cho rõ ràng. – ephemient

12

Trong một trong Repos của bạn, làm như sau:

$ git remote add other-repo git://.../other-repo.git 
$ git remote update 
$ git log other-repo/master...master 
    # or maybe: 
$ gitk master... other-repo/master 

này mang đến cho bạn sự khác biệt đối xứng giữa hai Repos; điều này cho bạn thấy tất cả các cam kết trong một repo, nhưng không phải là khác.

0

Bạn có thể đặt (lấy) cả kho vào kho lưu trữ duy nhất, một trong hai cái mới, hoặc một trong những tồn tại, như trong phản ứng bằng cách ephemient, Charles BaileyBrian Campbell. Hoặc bạn có thể sử dụng mẹo từ trang Tips and Tricks trên Git Wiki hoặc để biết chính xác hơn "Cách so sánh hai kho lưu trữ cục bộ" ở đó. Có thể đơn giản hơn để tạo danh sách SHA-1 của các cam kết theo thứ tự topo bằng cách sử dụng "git rev-list" (hoặc "git-log" với các tùy chọn thích hợp), và kiểm tra phiên bản đầu tiên chúng khác nhau.

+0

Liên kết Mẹo và Thủ thuật cung cấp cho "Không tìm thấy", đã di chuyển hoặc đã biến mất chưa? – Chris

+0

Git Wiki lần đầu tiên chuyển từ http://git.or.cz sang http://git.wiki.kernel.org nhưng thứ hai sau khi đột nhập vào kernel.org vẫn chưa quay lại (và nó không được biết nếu nó sẽ được beack ở đó, hoặc có thể ở đâu đó tại http://git-scm.com). http://git.wiki.kernel.org ở chế độ chỉ đọc để tất cả các liên kết đã thay đổi. ** Mẹo và thủ thuật ** (aka ** GitTips **) có tại đây: https://git.wiki.kernel.org/articles/g/i/t/GitTips_81aa.html –

0

Gần đây tôi đã có nhu cầu tương tự. Tôi đã có một dự án từ xa nhân bản mà tôi cần để so sánh với một cơ sở mã được sao chép hiện tại. Các bản ghi git không có liên quan, bởi vì các cam kết không có điểm gì chung, và tôi không chắc chắn chúng phân nhánh từ cùng một cơ sở mã.

Để giải quyết vấn đề, tôi đã sử dụng git theo cách bạo lực. Tôi sao chép các tập tin được kiểm tra vào git repo, sau đó kiểm tra các git status cho một danh sách thay đổi tập tin.

Ngoài ra, git diff <filename> cũng có thể được sử dụng để kiểm tra thêm. Tôi có thể so sánh các tệp trong phạm vi

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