Câu trả lời:
Theo "xuất git" (như "xuất svn")?
Bạn có thể sử dụng git checkout-index
cho điều đó, đây là một lệnh cấp thấp, nếu bạn muốn xuất mọi thứ, bạn có thể sử dụng -a
,
git checkout-index -a -f --prefix=/destination/path/
Để trích dẫn các trang người đàn ông:
Cuối cùng "/" [trên tiền tố] là quan trọng. Tên được xuất theo nghĩa đen chỉ là tiền tố với chuỗi được chỉ định.
Nếu bạn muốn xuất một thư mục nhất định, có một số thủ thuật liên quan. Lệnh chỉ lấy các tập tin, không phải thư mục. Để áp dụng nó cho các thư mục, sử dụng lệnh 'find' và dẫn đầu ra cho git.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Cũng từ các trang người đàn ông:
Trực giác không phải là mục tiêu ở đây. Lặp lại là.
GIT_WORK_TREE=../path/to/place git checkout
git worktree
(xem bên dưới) imho là câu trả lời kinh điển ngày hôm nay và có thể được thêm vào đây.
Một giải pháp khác sạch hơn một chút - chỉ cần xác định một cây công việc khác.
Để kiểm tra mọi thứ từ ĐẦU của bạn (không phải chỉ mục) đến một thư mục cụ thể:
git --work-tree=/path/to/outputdir checkout HEAD -- .
Để kiểm tra thư mục con hoặc tệp từ CHÍNH của bạn đến một thư mục cụ thể:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopy
thay vì --work-tree=~/okcopy
(có thể sử dụng một đường dẫn tương đối trong khi ngồi trong cùng một cây git cũng hoạt động, nhưng cách đó nằm ở sự điên rồ và git status
đầu ra trong R'lyehian)
git status
sau đó hiển thị rất nhiều mod (có lẽ vì chỉ mục hiện khớp với thư mục khác và không phải là cây công việc bình thường chưa được xử lý). git reset
đã đưa nó trở lại trạng thái tốt.
git status
cho thấy rất nhiều mod, và git reset
không giúp được gì. Tôi đã phải git checkout -f HEAD
khôi phục lại trạng thái của repo của tôi.
fatal: This operation must be run in a work tree
git reset
đủ để khôi phục cây làm việc chính trở nên tỉnh táo. Để xuất một cách an toàn các thư mục con của kho lưu trữ tại bất kỳ SHA1, chi nhánh hoặc thẻ nào mà không sửa đổi cây làm việc chính, hãy xem giải pháp khét tiếng của Charles Bailey . Tương tự, để kiểm tra an toàn nhiều chi nhánh cùng một lúc, tiểu ban mới là bạn của bạn. git archive
git worktree add
Đối với một tệp duy nhất:
git show HEAD:abspath/to/file > file.copy
SHA1 ID
gì có thể dễ dàng tìm thấy thông qua gitk
. Nếu tôi chỉ cần "kiểm tra" tệp đó đến một vị trí tạm thời (nghĩa là không hoàn nguyên), thì tôi sẽ sử dụng show
tiểu ban:git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
Các giải pháp trên không hiệu quả với tôi vì tôi cần kiểm tra một phiên bản được gắn thẻ cụ thể của cây. Nhân tiện, đó là cách cvs export
sử dụng. git checkout-index
không lấy đối số thẻ, vì nó kiểm tra các tệp từ chỉ mục. git checkout <tag>
sẽ thay đổi chỉ mục bất kể cây công việc, vì vậy tôi sẽ cần thiết lập lại cây ban đầu. Giải pháp hiệu quả với tôi là sao chép kho lưu trữ. Bản sao được chia sẻ khá nhanh và không tốn nhiều dung lượng. Thư mục .git
có thể được gỡ bỏ nếu muốn.
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
Các phiên bản mới hơn của git sẽ hỗ trợ git clone --branch <tag>
để tự động kiểm tra thẻ được chỉ định:
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .
không làm việc cho bạn?
Nếu bạn đang làm việc theo tính năng của mình và không muốn kiểm tra lại thành chủ, bạn có thể chạy:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
Nó sẽ tạo ../myrepo_master
thư mục với các master
cam kết chi nhánh, nơi bạn có thể tiếp tục làm việc
git --work-tree=/path/to/outputdir checkout HEAD -- .
nó không làm gì với chỉ mục, chỉ cần sao chép nhánh được chọn vào vị trí đã chỉ định (có thêm tệp .git).
myrepo_master
thư mục
git worktree remove ../myrepo_master
Câu trả lời của Adrian đã ném "gây tử vong: Hoạt động này phải được chạy trong một cây làm việc." Sau đây là những gì làm việc cho chúng tôi.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Ghi chú:
--no-checkout
Không kiểm tra bất cứ điều gì vào worktree mới.--detach
Không tạo một nhánh mới cho bàn làm việc mới.<some-ref>
làm việc với bất kỳ ref, ví dụ, nó hoạt động với HEAD~1
.git worktree prune
.Ngoài câu trả lời của @ hasen . Để liệt kê các tệp cần thanh toán , bạn có thể muốn sử dụng git ls-files
thay vì find
thích:
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z
! Rất vui khi bạn cung cấp tập lệnh không dễ bị tấn công nhất định.
Tôi đã xác định một bí danh git để đạt được điều này (trước khi tôi tìm thấy câu hỏi này).
Đây là một hàm bash ngắn giúp lưu đường dẫn hiện tại, chuyển sang repo git, thực hiện kiểm tra và trả về nơi nó bắt đầu.
kiểm tra git để phát triển ~ / my_project_git
Ví dụ này sẽ kiểm tra nhánh phát triển vào thư mục "~ / my_project_git".
Đây là mã bí danh bên trong ~/.gitconfig
:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
Tôi đang sử dụng bí danh này để kiểm tra một nhánh trong một thư mục tạm thời:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
Sử dụng:
git cot mybranch
Sau đó, bạn được thả vào một shell mới trong thư mục tạm thời nơi bạn có thể làm việc trên nhánh. Bạn thậm chí có thể sử dụng các lệnh git trong thư mục này.
Khi bạn hoàn tất, xóa thư mục và chạy:
git worktree prune
Điều này cũng được thực hiện tự động trong bí danh, trước khi thêm một worktree mới.