2009-07-16 20 views
5

Tôi vừa có kinh nghiệm đầu tiên với việc viết lại lịch sử của một trong các repo của tôi (sử dụng git-filter-branch). Vấn đề là repo có một số thẻ, mà sau khi viết lại dường như hoàn toàn bị ngắt kết nối khỏi lịch sử kết quả. Tôi nghĩ rằng điều này là do thực tế là lịch sử liên kết với các thẻ đã không được viết lại, vì vậy họ phải trỏ đến các cam kết cũ. Vì vậy, tôi có thể làm gì để "áp dụng" các thẻ trên lịch sử mới. Một nghệ thuật ASCII chút, có lẽ nó dễ dàng hơn để hiểu câu hỏi của tôi:Git, viết lại lịch sử của chi nhánh chính và các thẻ liên quan

gốc repo: Cơ cấu

+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

Repo báo cáo của gitk --all sau lịch sử viết lại:

+ HEAD 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    + Initial commit 
+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

Trả lời

5

Look như bước cuối cùng của số này procedure described here

$ git log --pretty=oneline origin/releases | 
    sed -n -e '/^\([0-9a-f]\{40\}\) Tag\(release\)\? \(.*\)/s--\3|\1|Tag release \3-p' 
    > ~/paludis-git-tags 

$ while read name msg head ; do 
    git tag -m "${msg}" ${name} ${head} ; 
    done < paludis-git-tags 

Ý tưởng là đọc thẻ từ các phiên bản cũ của kho, để áp dụng lại chúng trên lịch sử mới.


Lưu ý: sử dụng ban đầu của bạn của git-filter-branch, cậu sử dụng:

-- --all 

?

số -- tách các tùy chọn chi nhánh lọc khỏi tùy chọn sửa đổi và --all để viết lại tất cả các chi nhánh và thẻ.

Nó có thể đã giữ thẻ tại chỗ về lịch sử mới (tôi đã không kiểm tra nó chưa mặc dù)

+0

Cảm ơn VonC, tôi bỏ lỡ '- --all' phần.May mắn là tôi đã có một bản sao lưu của kho lưu trữ và thử lại với tùy chọn '--all' và nó hoạt động như tôi muốn. –

3

Trước tiên, bạn phải viết lại thẻ quá, ví dụ (như VonC said) bằng cách sử dụng tùy chọn --all để viết lại tất cả các tham chiếu.

Nếu bạn có thẻ được chú thích (thẻ hạng nặng), bạn cũng phải sử dụng tùy chọn --tag-name-filter, ví dụ: là --tag-name-filter cat. Lưu ý rằng bạn không thể viết lại các thẻ đã ký!

+0

Cảm ơn Jakub, tôi không biết về thẻ được chú thích và ký. Thông tin hữu ích. Cảm ơn một lần nữa. –

1

Nếu bạn muốn thực hiện thay đổi có thể thực hiện với git filter-branch, thì bạn có thể sử dụng --tag-name-filter như được giải thích ở trên.

Nếu bạn muốn thực hiện khôi phục tương tác, bạn cần một thứ khác.

Cả hai điều này có thể được thực hiện với git rebasetags

Trong trường hợp rebase là tương tác, bạn sẽ được trình bày với một vỏ bash nơi bạn có thể thực hiện các thay đổi. Khi thoát khỏi trình bao đó, các thẻ sẽ được khôi phục.

enter image description here

Từ this post

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