2015-04-29 18 views
16

Chúng tôi có kho lưu trữ Git chứa dữ liệu đầu vào SVM AI và kết quả. Mỗi lần chúng tôi chạy một mô hình mới, chúng ta tạo một thư mục gốc mới cho mô hình đó để chúng tôi có thể tổ chức kết quả của chúng tôi theo thời gian:Git lưu trữ các tệp trùng lặp như thế nào?

/run1.0 
    /data 
    ... 100 mb of data 
    /classification.csv 
    /results.csv 
    ... 
/run2.0 
    /data 
    ... 200 mb of data (including run1.0/data) 
    /classification.csv 
    /results.csv 
    ... 

Như chúng ta đã xây dựng mô hình mới, chúng tôi có thể lấy dữ liệu (file .wav lớn) từ lần chạy trước. Điều này có nghĩa rằng thư mục dữ liệu 2.0 của chúng tôi có thể chứa tất cả các tệp từ 1.0/dữ liệu cộng với dữ liệu bổ sung mà chúng tôi có thể đã thu thập được.

Repo dễ dàng vượt quá Gigabyte nếu chúng tôi tiếp tục.

Git có cách nhận dạng tệp nhị phân trùng lặp và chỉ lưu trữ chúng một lần (ví dụ như một liên kết tượng trưng) không? Nếu không, chúng tôi sẽ làm lại cách dữ liệu được lưu trữ.

Trả lời

14

Tôi có thể sẽ không giải thích điều này đúng nhưng hiểu biết của tôi là mỗi cam kết chỉ lưu trữ cấu trúc cây biểu diễn cấu trúc tệp của dự án của bạn với con trỏ đến tệp thực được lưu trữ trong một đối tượng phụ thư mục. Git sử dụng một băm SHA1 của các nội dung tập tin để tạo ra các tên tập tin và thư mục phụ, vì vậy ví dụ nếu nội dung của một tập tin được tạo ra băm sau:

ob064b56112cc80495ba59e2ef63ffc9e9ef0c77 

Nó sẽ được lưu trữ như:

.git/objects/ob/064b56112cc80495ba59e2ef63ffc9e9ef0c77

Hai ký tự đầu tiên được sử dụng làm tên thư mục và phần còn lại là tên tệp.

Kết quả là ngay cả khi bạn có nhiều tệp với cùng nội dung nhưng tên khác nhau hoặc ở các vị trí khác nhau hoặc từ các cam kết khác nhau thì chỉ có một bản sao được lưu.

+0

Thú vị ... điều này sẽ tạo ra rất nhiều ý nghĩa và tôi đã tự hỏi nếu đây là những gì đang xảy ra. Tôi sẽ phải làm một số đào để xem nếu điều này thực sự là trường hợp (khi tôi nhận được một số thời gian miễn phí). – JoshJ

+2

pastebin.com/p0KpqBPX cho những người bạn quá lười biếng để thử nghiệm :) Cùng một đối tượng, chỉ cần thêm một chút không gian cần thiết hơn 1 tệp trong .git/objects – opatut

+0

Nó không phải là lười biếng, chỉ thiếu thời gian :) Làm tốt lắm! – JoshJ

7

Theo mặc định/bản thân: số Yes.

Git hoạt động trên cơ sở nó tạo ra ảnh chụp nhanh các tệp và không có sự khác biệt gia tăng như các VCS khác.

EDIT

Như đã đề cập bởi Dave và opatut, hiểu biết của tôi về cách git lưu trữ tập tin không chính xác và tôi xin lỗi vì sự nhầm lẫn gây ra. Sau khi thực hiện nhiều nghiên cứu, Git lưu trữ các tệp trùng lặp dưới dạng con trỏ tới 1 tệp. Trích dẫn VonC trong câu trả lời được chấp nhận của this question,

... một số tệp có cùng nội dung chỉ được lưu một lần.

Xin lưu ý rằng như đã đề cập trong câu trả lời đó, khái niệm ...

Tham chiếu git-scm documentation:

Git nghĩ về dữ liệu của nó giống như một bộ cảnh chụp từ nhỏ hệ thống tập tin. Mỗi khi bạn cam kết, hoặc lưu trạng thái của dự án của bạn trong Git, về cơ bản nó có một hình ảnh về tất cả các tệp của bạn trông như thế nào tại thời điểm đó và lưu trữ một tham chiếu đến ảnh chụp nhanh đó. Để hiệu quả, nếu các tệp chưa thay đổi, Git không lưu trữ lại tệp, chỉ một liên kết vào tệp giống hệt trước đó mà tệp đã lưu trữ. Git nghĩ về dữ liệu của nó giống như một dòng ảnh chụp nhanh.

Tuy nhiên, về mặt kĩ lưu trữ, đồng bằng châu thổ vẫn được sử dụng trong đó Git cố gắng để tạo ra vùng đồng bằng nhỏ nhất có thể dựa trên lựa chọn dựa trên kinh nghiệm của các đốm màu càng nhanh càng tốt, có những lựa chọn tối ưu hóa cho việc nén. Điều này sẽ làm giảm kích thước của kho lưu trữ.

Cũng như được thử nghiệm bởi opatut trong pastebin link đầu ra từ nhận xét, đối tượng trùng lặp chỉ được lưu trữ một lần. Điều đó có nghĩa là git sẽ nhận ra các tệp nhị phân trùng lặp và chỉ lưu trữ chúng một lần. Đó là những gì câu hỏi ban đầu được yêu cầu. Sau đây là các tùy chọn khác để xử lý các tệp trùng lặp.

thay thế khác: symlink

Bạn có thể thiết lập liên kết tượng trưng để các tập tin trước đó, như vậy khi bạn làm việc trên họ, họ sẽ trỏ đến file lớn cùng, tuy nhiên lưu ý rằng git không theo dõi các tệp mà các liên kết tượng trưng trỏ đến, nghĩa là chúng sẽ chỉ chỉ lưu trữ liên kết tượng trưng. Điều này đáp ứng nhu cầu của bạn để giảm không gian, với sự hy sinh của tính di động, nghĩa là, nếu bạn di chuyển đến một máy tính khác, bạn sẽ phải chắc chắn rằng các tập tin là nơi các liên kết tượng trưng trỏ đến. Mà có thể không phải là những gì bạn muốn. Xem this very good SO Q&A về những gì git làm với các liên kết tượng trưng.

Một giải pháp thay thế khác: công cụ!

Tôi đã tìm thấy nhiều công cụ có thể giúp hoàn thành những gì bạn cần khi quản lý tệp nhị phân. Bạn có thể thử git-annex, nơi mà về cơ bản nó chỉ theo dõi phiên bản mới nhất của tệp nhị phân và phần còn lại được duy trì bởi các liên kết tượng trưng, ​​do đó theo cách này, cách xử lý biểu tượng tự động hơn. Here's their project site.

Hoặc được xây dựng trong git-submodules và một repo riêng biệt để đạt được những gì bạn muốn, nơi bạn chỉ tìm nạp các tệp nhị phân lớn để sử dụng chúng.

Phải thừa nhận rằng tôi không thử các tùy chọn này, vì vậy, đây là liên kết tham chiếu để đọc thêm giải thích về chúng. Tham khảo: Tham chiếu: this SO question

+1

Thật là một câu trả lời tuyệt vời. Tôi đã bắt đầu khám phá tinh thần ý tưởng về các liên kết tượng trưng nhưng không chắc chắn những gì đã có sẵn. Tôi sẽ xem xét điều đó ngay bây giờ. Cảm ơn bạn. – JoshJ

+0

@JoshJ không có vấn đề, vui vì tôi có thể giúp đỡ, và tôi đang khiêm nhường bởi lời khen của bạn. chúc may mắn thực hiện nó! – matrixanomaly

+1

Câu trả lời của bạn gây nhầm lẫn và gây nhầm lẫn một chút, IMO. Trong thực tế, git xem xét hai tệp có cùng SHA giống nhau, đường dẫn của chúng không quan trọng. Vì vậy, cho câu hỏi của OP, nó là tốt, git sẽ không lưu trữ cùng một tập tin nhiều lần. Xem câu trả lời của Dave Sexton vì sao. – opatut

0

Ngay cả khi git lưu trữ các tệp khi bạn lưu trữ theo cách của mình, bạn đang sử dụng VCS theo cách xấu và mất tất cả các ưu điểm của việc sử dụng VCS bằng cách không thể xem những thay đổi nào được thực hiện giữa 2 phiên bản.

Bạn nên có thư mục 'chạy' với tệp của mình và thực hiện cam kết cho mỗi phiên bản mới (ngay cả với thẻ nếu bạn muốn thấy dễ dàng hơn 'chạy' quan trọng).

Bằng cách đó bạn có thể gửi những gì đã được thực hiện giữa các phiên bản và cải thiện công việc của bạn.

Không cần phải giữ mọi thứ trong hoa hướng dương!

Điều bạn cố gắng làm là điều xấu !!

+0

Vâng, thật không may, đây không phải là số phiên bản. Đây là những mô hình hoàn toàn khác nhau và có thể cần phải chia sẻ thông tin trên chúng và để lấy tất cả chúng trong một lần thanh toán đơn mà không cần phải nhảy xung quanh bản sửa đổi. – JoshJ

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