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
, svndumpfilter
và svnadmin 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.
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
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
@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