OP muốn truy xuất tất cả các phiên bản nhưng câu trả lời sẽ không phân phối. Đặc biệt nếu tệp có hàng trăm bản sửa đổi (tất cả các đề xuất đều quá thủ công).Giải pháp nửa làm việc duy nhất đã được đề xuất bởi @Tobias trong các ý kiến, nhưng đề nghị bash loop sẽ xây dựng các tập tin theo thứ tự ngẫu nhiên cũng như nó tạo ra hàng trăm tập tin rỗng khi được sử dụng chống lại repos của chúng tôi. Một trong những lý do là "rev-list --all --objects" sẽ liệt kê các đối tượng khác nhau (cây bao gồm - nhưng vô ích cho mục đích của chúng tôi).
Tôi bắt đầu với giải pháp của Tobias, thêm bộ đếm, dọn dẹp một chút và kết thúc việc phát minh lại bánh xe dưới dạng tập lệnh bash được liệt kê bên dưới.
Các kịch bản sẽ:
- trích xuất tất cả phiên bản tập tin vào/tmp/all_versions_exported
- mất 1 đối số - đường dẫn tương đối đến tập tin bên trong git repo
- cho kết quả tên tập tin tiền tố số (sắp xếp được)
- đề cập đến tên tệp được kiểm tra trong tệp kết quả (để nói táo ngoài cam)
- đề cập ngày cam kết trong tên tệp kết quả (xem ví dụ đầu ra bên dưới)
- không tạo tệp kết quả rỗng
mèo/usr/local/bin/git_export_all_file_versions
#!/bin/bash
# we'll write all git versions of the file to this folder:
EXPORT_TO=/tmp/all_versions_exported
# take relative path to the file to inspect
GIT_PATH_TO_FILE=$1
# ---------------- don't edit below this line --------------
USAGE="Please cd to the root of your git proj and specify path to file you with to inspect (example: $0 some/path/to/file)"
# check if got argument
if [ "${GIT_PATH_TO_FILE}" == "" ]; then
echo "error: no arguments given. ${USAGE}" >&2
exit 1
fi
# check if file exist
if [ ! -f ${GIT_PATH_TO_FILE} ]; then
echo "error: File '${GIT_PATH_TO_FILE}' does not exist. ${USAGE}" >&2
exit 1
fi
# extract just a filename from given relative path (will be used in result file names)
GIT_SHORT_FILENAME=$(basename $GIT_PATH_TO_FILE)
# create folder to store all revisions of the file
if [ ! -d ${EXPORT_TO} ]; then
echo "creating folder: ${EXPORT_TO}"
mkdir ${EXPORT_TO}
fi
## uncomment next line to clear export folder each time you run script
#rm ${EXPORT_TO}/*
# reset coutner
COUNT=0
# iterate all revisions
git rev-list --all --objects -- ${GIT_PATH_TO_FILE} | \
cut -d ' ' -f1 | \
while read h; do \
COUNT=$((COUNT + 1)); \
COUNT_PRETTY=$(printf "%04d" $COUNT); \
COMMIT_DATE=`git show $h | head -3 | grep 'Date:' | awk '{print $4"-"$3"-"$6}'`; \
if [ "${COMMIT_DATE}" != "" ]; then \
git cat-file -p ${h}:${GIT_PATH_TO_FILE} > ${EXPORT_TO}/${COUNT_PRETTY}.${COMMIT_DATE}.${h}.${GIT_SHORT_FILENAME};\
fi;\
done
# return success code
echo "result stored to ${EXPORT_TO}"
exit 0
Cách sử dụng Ví dụ:
cd /home/myname/my-git-repo
git_export_all_file_versions docs/howto/readme.txt
result stored to /tmp/all_versions_exported
ls /tmp/all_versions_exported
0001.17-Oct-2016.ee0a1880ab815fd8f67bc4299780fc0b34f27b30.readme.txt
0002.3-Oct-2016.d305158b94bedabb758ff1bb5e1ad74ed7ccd2c3.readme.txt
0003.29-Sep-2016.7414a3de62529bfdd3cb1dd20ebc1a977793102f.readme.txt
0004.28-Sep-2016.604cc0a34ec689606f7d3b2b5bbced1eece7483d.readme.txt
0005.28-Sep-2016.198043c219c81d776c6d8a20e4f36bd6d8a57825.readme.txt
0006.9-Sep-2016.5aea5191d4b86aec416b031cb84c2b78603a8b0f.readme.txt
<and so on and on . . .>
chỉnh sửa: nếu bạn thấy lỗi như thế này:
gây tử vong: Không phải tên đối tượng hợp lệ 3e93eba38b31b8b81905ceaa95eb47bba ed46494: readme.txt
có nghĩa là bạn đã bắt đầu tập lệnh không phải từ thư mục gốc của dự án git.
Nguồn
2017-01-24 17:23:20
Câu trả lời được chấp nhận trước đây (@sehe) thực sự không thực hiện trực tiếp việc truy xuất TẤT CẢ các phiên bản cùng một lúc. Như đã đề cập trong bình luận tôi đã sử dụng cả hai lệnh để xây dựng một chương trình java (không phải là một giải pháp chung có thể được tải lên như là) mà đã làm nó. Giải pháp của bạn tốt hơn vì nó mang lại kết quả cuối cùng của chương trình java trong quá khứ của tôi. – max152
Kịch bản này hoạt động, nhưng có một số vấn đề và hành vi có thể không mong muốn. Vui lòng xem [câu trả lời của tôi] (http://stackoverflow.com/a/43747334/1132502) để biết chi tiết và tập lệnh được cập nhật. –
@Nathan, tuyệt vời! vui vì bạn thấy hữu ích +1 –