2017-01-05 20 views
10

Vì vậy, tôi muốn xuất tất cả các file bắt đầu từ cụ thể cam kết id cho đến ngày hôm nay (có thể bao gồm các cam kết sau này), vì vậy tôi đang làm điều này:file xuất khẩu Git như zip/tar từ quy định cam kết cho đến hôm nay

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar

Tuy nhiên, có vẻ như chỉ nộp kết quả đầu ra này đã được sửa đổi trong quy định cam kết id ($commitId).

Những gì tôi đang tìm kiếm mặc dù là nó nên xuất khẩu tất cả các file bắt đầu từ id được chỉ định cam kết cho đến ngày hôm nay (bao gồm bất kỳ cam kết hơn nữa mà có thể đã xảy ra trong quá trình thời gian).

+1

bạn có thể xác định một cách chi tiết hơn những gì bạn muốn? Bạn có muốn lưu trữ (1) của * tất cả các tệp * trong * phiên bản hiện tại * hay (2) của * tất cả các tệp * trong * tất cả các phiên bản * kể từ cam kết cụ thể hay (3) * phiên bản hiện tại * của các tệp đã được * thay đổi * vì cam kết cụ thể (có thể không phải tất cả các tệp), hoặc (4) * tất cả các phiên bản * của các tệp đã được * thay đổi * vì cam kết cụ thể (có thể không phải tất cả các tệp)? – mkrieger1

+0

Bạn có thể muốn sử dụng [ 'git bundle'] (https://git-scm.com/docs/git-bundle) hoặc [' git archive'] (https://git-scm.com/docs/git -archive). – mkrieger1

Trả lời

3

Trích dẫn từ Git documentation:

git diff-cây - So sánh nội dung và phương thức blobs tìm thấy qua hai cây đối tượng

...

Nếu có là chỉ có một, cam kết được so sánh với cha mẹ của nó (xem - dưới đây).

Trong trường hợp của bạn, bạn chỉ cho một <tree-ish> để so sánh với bố mẹ của $commitId. Thay vào đó, bạn nên cung cấp hai số <tree-ish> es để so sánh được thực hiện giữa.

Giả sử các cam kết đang trên chi nhánh tổng thể và chi nhánh tổng thể là hoàn toàn up-to-date; sau đó các lệnh sau đây sẽ cung cấp cho những gì bạn muốn:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar 

Các ~1 sau ${commitId} được do đó hãy so sánh tương đối với cha mẹ ${commitId} 's, nếu không thay đổi trong ${commitId} sẽ không được tính.

5
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar 
  1. git diff là đủ; bạn không cần sử dụng git diff-tree để tìm danh sách các tên tệp đã thay đổi trong phạm vi cam kết.
  2. tùy chọn -z trong git diff-0 trong xargs đảm bảo sử dụng các dấu cách trường đầu ra NUL, nếu không bất kỳ đường dẫn/tên tệp nào có dấu cách sẽ làm cho lệnh của bạn bị hỏng.
  3. ${commitId}~ HEAD liệt kê các thay đổi giữa cam kết gốc của ${commitId} (vì vậy các thay đổi trong cam kết đó được bao gồm) và cam kết gần đây nhất (HEAD).
+0

Đây là giải pháp của bạn. Tôi sẽ sử dụng $ {commitId} ~ 1 để thay thế, bởi vì tôi thấy nó rõ ràng hơn, nhưng cũng giống như vậy. Điều tuyệt vời về giải pháp này, là nếu bất kỳ tệp nào đã được sửa đổi và sau đó sửa đổi lại (chỉnh sửa được hoàn tác trong cam kết tiếp theo), chúng sẽ bị bỏ qua khỏi tar cuối cùng! :-) –

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