2010-09-08 35 views
10

Cập nhật: Tôi đã cố gắng đơn giản hóa ví dụ thực tế ở đây để có giải thích rõ ràng về các tùy chọn của tôi, nhưng điều đó không thực sự hiệu quả. Các ví dụ liên kết dưới đây cho đến nay là quá chung chung để có được ngay cả ví dụ đơn giản này làm việc.Làm thế nào để trích xuất một tập hợp con của lịch sử từ Git?

Tôi đã có thể thực hiện loại điều này với SVN mọi lúc và khá giỏi về nó. Bây giờ tôi đang tìm thấy nó cực kỳ khó khăn trong Git và bắt đầu tin rằng lịch sử của tôi về cơ bản là quá chen chúc nhau để có thể kéo nó ra xa nhau.

Vấn đề thực tế: Tôi có khoảng một chục tệp đã được di chuyển và đổi tên. Lịch sử của họ được trộn lẫn với lịch sử của hàng trăm tệp khác mà tôi muốn xóa hoàn toàn lịch sử.

Trong SVN, tôi có thể sử dụng chuỗi kết xuất/bộ lọc bao gồm/loại trừ bộ lọc/tải để kho lưu trữ được cắt xuống và hiếm khi tôi có thể cần đổi tên đường dẫn thủ công trong tệp kết xuất trước khi tải.

Something như thế này và tôi sẽ được thực hiện:

SET Includes=trunk/src/Foo.aaa trunk/src/Foo.bbb trunk/src/Foo trunk/src/Bar 
SET Excludes=trunk/src/Bar/Blah.aaa trunk/src/Foo/Blah.aaa 

svnadmin dump FooSrc > Full.dump 2> Dump.log 
svndumpfilter include %Includes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Full.dump> Filter_1.dump 2> Filter_1.log 
svndumpfilter exclude %Excludes% --skip-missing-merge-sources --renumber-revs --drop-empty-revs <Filter_1.dump> Filter_2.dump 2> Filter_2.log 
svnadmin create FooDest 
svnadmin load FooDest --ignore-uuid <Filter_2.dump> Load.log 2> Load_Errors.log 

Có ai có một ví dụ tốt về điều này có nghĩa là nhiều hơn chỉ là một loại bỏ tầm thường của một tập tin duy nhất hoặc xuất khẩu một thư mục con duy nhất?

Cách đơn giản nhất tôi có thể xác định tập hợp các tệp là danh sách 7 đường dẫn thư mục. Tất cả mọi thứ bên trong các thư mục đó cần phải được lưu giữ và mọi thứ bên ngoài cần phải được lược bớt khỏi lịch sử.


vấn đề đơn giản:

Tôi có một kho Git trong đó có một số ít các tập tin mà tôi muốn trích xuất vào kho riêng của mình. Vấn đề là những tập tin này đã được tạo ra và sửa đổi trong suốt lịch sử của kho gốc, vì vậy tôi gặp khó khăn trong việc tìm ra cách để giải nén chúng một cách rõ ràng.

Dưới đây là ý chính về lịch sử của tôi trông như thế nào (chỉ với nhiều cam kết hơn và nhiều hơn nữa để bỏ qua). Như bạn có thể thấy tôi rõ ràng là không có kế hoạch để có những tập tin này sau đó được đào nhặt ra khỏi lịch sử:

commit 4a09d3f977a8595d9e3f61766a5fd743e4265a56 

M src/Foo/Bar/FileToExtract2.foo 
A src/Foo/Bar/FileToExtract3.bar 
D src/Foo/AnotherFileToIgnore.txt 

commit 05d26f23518083270cc45bf037ced29bec45e064 

M src/Foo/Blah/IgnoreThisOneToo.foo 
M src/Foo/AnotherFileToIgnore.txt 

commit 343187228f4bd8e4427395453034c34ebd9a95f3 

M src/Foo/Bar/FileToExtract1.txt 
M src/Foo/AnotherFileToIgnore.txt 

commit 46a0129104ac31291462f657292aab43f8883d8d 

A src/Foo/Bar/FileToExtract1.txt 
A src/Foo/Bar/FileToExtract2.foo 
M src/Foo/FileToIgnore.txt 

commit 3fe6af56f0d8dc42fcb5b0bafee41bff534ba2cc 

A src/ReadMe.txt 
A src/IgnoreMe.foo 
A src/Foo/FileToIgnore.txt 
A src/Foo/Blah/IgnoreThisOneToo.foo 
A src/Foo/AnotherFileToIgnore.txt 

Cuối cùng, những gì tôi muốn có là một kho lưu trữ sạch với hoàn chỉnh lịch sử của chỉ các tệp trong src/Foo/Bar/. Phần còn lại có thể bỏ qua. Tôi cũng ổn với việc giữ kho lưu trữ này như (tức là không có lịch sử viết lại) và chỉ cam kết xóa toàn bộ thư mục đó.

Trong SVN, tôi sẽ sử dụng svnadmin dump, svndumpfiltersvnadmin load. Nếu tôi cẩn thận, tôi thậm chí có thể chỉnh sửa tệp kết xuất theo cách thủ công để xóa đường dẫn, v.v.

Tôi đã xem qua các lệnh Git và không thể thấy cách thực hiện điều này. Mọi sự trợ giúp sẽ rất được trân trọng.

Trả lời

7

Bạn có thể sử dụng git filter-branch và tách thư mục Foo trong thư mục riêng của nó.
Xem:

+0

Tuyệt vời. Tôi nghĩ đây chính xác là những gì tôi đang tìm kiếm. Tôi sẽ thử nó tối nay. Cảm ơn! – mckamey

+0

Có vẻ như đây là những gì tôi cần, nhưng nếu tôi muốn bao gồm nhiều hơn một thư mục con trong kho lưu trữ mới bị cắt bớt thì sao? Có vẻ như 'git filter-branch --subdirectory-filter ' chỉ nhận một giá trị? – mckamey

+0

@McKAMEY: http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories là một khởi đầu tốt: submodules hoặc subtree merge. – VonC

3

Tương đương svnadmin dump, svndumpfiltersvnadmin load sẽ git fast-export, một kịch bản riêng SVN (xem examples) và git fast-import.

+0

@VonC: Cảm ơn bạn đã cung cấp liên kết. –

+0

Tôi có 7 thư mục chứa tất cả danh sách các tệp tôi cần trích xuất. Tôi phải chỉ định gì giữa xuất và nhập để lọc tất cả mọi thứ trừ 7 thư mục này? Tôi cần tương đương với 'svndumpfilter include'. – mckamey

+0

Liên kết "xem ví dụ" chỉ cung cấp một ví dụ về "sed" s | refs/heads/master | refs/heads/other | "' cho tập lệnh lọc. Làm thế nào tôi sẽ nói về Git để loại bỏ tất cả các tập tin mà không tồn tại như là một trong 7 thư mục con của tôi? – mckamey

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