Nếu bạn có thể thuyết phục trình soạn thảo viết phiên bản tệp mà bạn muốn được dàn dựng, bạn có thể sử dụng lệnh git cấp nước để thêm nó vào chỉ mục dưới tên đúng. Bạn cần phải bỏ qua "git add" mà sẽ luôn luôn liên kết đường dẫn X trong cây làm việc với đường dẫn X trong chỉ mục (theo như tôi biết).
Khi bạn có nội dung bạn muốn đặt giai đoạn được ghi vào một tệp tạm thời $ tempfile, hãy chạy git hash-object -w $tempfile
- điều này sẽ ghi đối tượng vào .git/objects và xuất ra id blob. Sau đó cấp id blob này cho chỉ mục bằng cách sử dụng git update-index --cacheinfo 100644 $blobid $path
để liên kết đường dẫn $ path với đối tượng đó.
Dưới đây là một ví dụ mà các giai đoạn thay đổi về một kịch bản gọi là "post_load" trong repo của tôi mà không ghi đè lên các tập tin riêng của mình (cũng chứng tỏ bạn có thể làm mà không có một tập tin tạm thời):
git update-index --cacheinfo 100755 $(perl -lne 'print unless (/^#/)' post_load \
| git hash-object -w --stdin) post_load
Bạn không đề cập đến mà bạn đang lập kế hoạch để làm điều này từ, vì vậy thật khó để tư vấn cho bạn về cách tích hợp này. Như tôi đã đề cập, bạn cần phải bằng cách nào đó trình bày git với tệp như bạn muốn nó được dàn dựng (hãy nhớ, git không giải quyết việc lưu trữ thay đổi). Nếu bạn có thể viết macro để chỉ lưu tệp dưới dạng "$ file.tmp", thì hãy sử dụng một cái gì đó như ở trên để git update-index --cacheinfo $the_mode $(git hash-object -w $file.tmp) $file
(lấy $ the_mode còn lại dưới dạng bài tập: p), xóa $ file.tmp và hoàn nguyên bộ đệm trình chỉnh sửa quay lại $ file mà về cơ bản những gì bạn đang yêu cầu.
Ví dụ: tập lệnh sau có ba đối số: M N path
. Nó sẽ cập nhật nội dung chỉ mục cho các tập tin vào "con đường" để dòng M đến N (bao gồm) được thay thế bằng nội dung từ stdin:
#!/bin/sh
start_line=$1
end_line=$2
path=$3
mode=$(git ls-files -s $path | awk '{print $1}')
blob_id=$(
(
head -n $(expr $start_line - 1) $path
cat
tail -n +$(expr $end_line + 1) $path
) | git hash-object -w --stdin
)
exec git update-index --cacheinfo $mode $blob_id $path
ví dụ echo "HELLO WORLD" | ./stage-part 8 10 post_load
sẽ thay thế ba dòng 8-10 với chỉ là "HELLO WORLD".
Bạn đính kèm ý tưởng thực hiện điều này từ bên trong trình soạn thảo như thế nào so với thông qua 'git add -i'? Bạn có thể có thể làm việc lên cái gì đó gọi là 'git diff', kéo ra những hunks chạm vào các dòng bạn đã chọn, và áp dụng bản vá đó cho chỉ mục, nếu bạn thực sự muốn ... – Cascabel