2012-07-02 14 views
5

Tôi có hai kho:Hợp nhất hai kho (dự án ban đầu và dự án thay đổi mà không LỊCH SỬ)

  • GEPHI (dự án mã nguồn mở lớn) được lưu trữ trên github
  • dự án của công ty tôi dựa trên GEPHI

7 tháng trước, khi dự án của chúng tôi bắt đầu, ai đó đã chụp nhanh dự án gephi trên github và lưu nó vào công ty svn => thay đổi lịch sử mất

bây giờ tôi đã quyết định di chuyển dự án của chúng tôi để git kho và hợp nhất các thay đổi với dự án ban đầu

tôi đã kho tại git di cư từ svn với git-svn

file của tôi không có lịch sử thay đổi vượt thoát thời gian khi dự án của chúng tôi bắt đầu

Tôi có thể ánh xạ trạng thái ban đầu của kho lưu trữ của chúng tôi về trạng thái của kho lưu trữ ban đầu không? Nói cách khác tôi muốn bắt đầu aplying thay đổi của chúng tôi để kho gốc từ bản sửa đổi cụ thể.

Cập nhật:

Hôm nay tôi tìm thấy trở ngại khác. Schema đầu tiên:

enter image description here

  • chi nhánh đỏ là dự án ban đầu

  • <alpha1><alpha2> là cam kết của các plugin cho dự án chính (không liên quan đến Mã cam kết trong <E' E'' E'''>)

  • trong <E'> <E''> <E'''> được thêm mã từ kho dự án chính (màu đỏ) <E> (trong mỗi cam kết c ca một phần ba dự án từ <E>)

Tôi đã tìm nạp kho màu đỏ và xanh thành một. Trên lược đồ thứ hai tôi có trạng thái mong muốn. có khả năng làm cái này không? (Ví dụ làm từ <E' E'' E''> chỉ là một cam kết (<E'>) và sau đó đánh dấu rằng cam kết như một sáp nhập từ các chi nhánh <ABCD><alpha1 alpha2>)

Cảm ơn bạn Julien trả lời của bạn. Nó có vẻ rất hữu ích.

Trả lời

5

Tuyên bố miễn trừ trách nhiệm: Tôi hiện đã kiểm tra điều này và có vẻ như nó hoạt động như mong đợi (tất nhiên là tôi đã hiểu bạn một cách chính xác). Tuy nhiên, vẫn còn rất nhiều thứ có thể sai. Tuyệt đối chỉ thử điều này trên một bản sao làm việc riêng biệt của kho lưu trữ của dự án của bạn, và đảm bảo kiểm tra mọi thứ trước khi đẩy nó vào bất cứ đâu. Giữ sao lưu toàn bộ thư mục của tiểu bang trước khi bạn làm điều này.

Vì vậy, tôi giả sử bạn có hai kho lưu trữ độc lập.Dự án ban đầu (GEPHI):

A---B---C---D---E 
       ^HEAD of Gephi 

Và dự án của bạn, mà phiên bản đầu tiên trông giống hệt với phiên bản cuối cùng của dự án ban đầu của:

E'---V---W---Y---...---Z 
        ^HEAD of your project 

(có thể với một số ngành, nhưng điều đó không thực sự quan trọng . ở đây)

Những gì bạn muốn có (nếu tôi hiểu đúng) là:

A---B---C---D---E---V---W---Y---...---Z 

Bạn có thể thử những điều sau đây. Một lần nữa, hãy tự làm việc này, tách cây làm việc riêng và đảm bảo mọi thứ đều theo thứ tự trước khi đẩy nó vào bất kỳ kho lưu trữ trung tâm nào!

Trong thời gian ở thư mục của cây làm việc của riêng mình, lấy người đứng đầu và các đối tượng của kho GEPHI gốc:

git fetch /path/to/original/gephi 

Nếu bạn chưa nhân bản kho GEPHI, bạn cũng có thể xác định github URL thay vì đường dẫn hệ thống tệp cục bộ.

này sẽ dẫn đến tình huống sau đây trong cây làm việc hiện tại của bạn:

A---B---C---D---E 
       ^FETCH_HEAD 

E'---V---W---Y---...---Z 
        ^HEAD 

Chúng tôi đã không thay đổi nhiều. Hiện nay, hai đầu cùng tồn tại một cách hòa bình và hoàn toàn độc lập với nhau, nhưng bây giờ bạn có quyền truy cập vào các đối tượng từ cả hai kho và có thể cố gắng kết hợp chúng.

Bây giờ chúng ta muốn loại bỏ E'(nó phải giống với E), và thay vào đó làm cho E phụ huynh của dự án của bạn đầu tiên cam kết, đó là V. Để làm điều này, bạn có thể sử dụng git filter-branch:

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat' 

Thay thế <V><E> bằng băm cam kết của V và E tương ứng. Để tìm ra những điều đó, bạn có thể thực hiện git log để kiểm tra các cam kết của dự án và, vì chúng tôi đã tìm nạp chúng, git log FETCH_HEAD để kiểm tra các cam kết của Gephi.

này một cách hiệu quả sẽ kết nối trực tiếp đến V E.

Điều này thậm chí nên có tác dụng nếu nó chỉ ra rằng người đứng đầu (tức là cam kết mới nhất) của kho GEPHI gốc không được dự án của bạn những gì bạn dựa trên, ý nghĩa rằng đã có những cam kết mới trong Gephi mà bạn chưa (chưa?) được chăm sóc. Chỉ cần chắc chắn, một lần nữa để thay thế <E> bằng hàm băm của cam kết mà bạn đã dựa trên các thay đổi của mình, không phải là bằng đầu.

Ngược lại, hãy đảm bảo rằng bạn thay thế <V> bằng hàm băm của thay đổi đầu tiên bạn đã thực hiện. Có lẽ kho lưu trữ của bạn không chứa E 'giống hệt E, nhưng cam kết đầu tiên đã chứa các thay đổi đối với bản gốc. Sau đó, băm cam kết đầu tiên này sẽ là <V> của bạn, thay vì mã băm sau đó.

Để tóm tắt cả đoạn cuối cùng: lệnh trên cũng nên làm việc nếu tình hình của bạn trông như thế nào, ví dụ như này:

A---B---C---D---E---F---G---H---I 
       ^   ^FETCH_HEAD 
       point where your project branched off 

V---W---Y---...---Z 
^    ^HEAD 
first change based on E 

Chỉ cần chắc chắn để sử dụng băm có ý nghĩa trong bối cảnh này cam kết.

+0

Tôi vừa thử nghiệm điều này và có vẻ như hoạt động (vì vậy tôi đã cập nhật cảnh báo của mình lên trên). Tôi vẫn hoàn toàn khuyên bạn nên thử điều này trên một cây làm việc dùng một lần và để thực hiện sao lưu đầy đủ. Thật dễ dàng để có được câu lệnh 'filter-branch' sai, hoặc trộn các hash! –

+0

Nếu dự án cục bộ có nhiều nhánh hoặc nếu có bất kỳ sự hợp nhất nào trong lịch sử, 'git rebase' không phải là công cụ phù hợp vì nó sẽ tuyến tính hóa lịch sử. Thay vào đó hãy sử dụng 'filter-branch'. –

+0

Cảm ơn. Đó là những gì tôi đã có ban đầu, nhưng tôi nghĩ rằng rebase có cú pháp dễ dàng hơn. Tôi đã hoàn nguyên các thay đổi và bây giờ nó chỉ đề cập đến nhánh lọc. –

1

Có vẻ như bạn có thể muốn điều tra grafts (hoặc có thể replacements) - những phương pháp khác nhau từ filter-branchrebase ở chỗ chúng thêm siêu dữ liệu thay đổi trạng thái hữu hình của các kho lưu trữ, chứ không phải viết lại lịch sử để thực sự hiệu quả sự thay đổi. Điều này rất hữu ích khi bạn có người sử dụng các nhánh hiện có, vì nó tránh được việc thay đổi lịch sử từ bên dưới chúng.

Trong trường hợp của bạn, bạn muốn thêm ghép cho E', cấp E làm phụ huynh.

+0

Tôi muốn giới thiệu 'git replace' trên ghép - thay thế là tham chiếu, vì vậy chúng có thể được đồng bộ hóa giữa các kho lưu trữ (với một refspec thích hợp). –

+0

Vâng, đó là sự thật trong rất nhiều trường hợp. Tuy nhiên, mô tả vấn đề giống như kho git vừa mới bắt đầu ("bây giờ tôi quyết định di chuyển dự án của chúng tôi [...]/i bây giờ có kho git"), và với một kho lưu trữ mới, tôi thích viết lại thực tế thay vì siêu dữ liệu bổ sung mà sẽ kéo dài cho đến cuối thời gian. –