2011-01-06 19 views
10

Tôi đang viết một đơn giản git hook pre-cam kết cập nhật năm trong tiêu đề bản quyền cho các tệp được dàn dựng để cam kết.Làm cách nào tôi có thể sử dụng git để chỉ hiển thị một dòng trong tệp cho cam kết, tất cả từ tập lệnh?

Sau khi sửa đổi đường có bản quyền, tôi muốn móc nối đoạn đường đó sao cho nó là một phần của cam kết. Nó không thể chỉ là git add toàn bộ tệp, bởi vì có thể có các thay đổi có sẵn khác trong đó không nên được dàn dựng.

Tôi không thấy bất kỳ tùy chọn nào trong hướng dẫn sử dụng git add cho phép bạn đặt các dòng cụ thể.

Tôi tìm tôi có thể git stash save --keep-index, áp dụng thay đổi của tôi, git add tệp và sau đó git stash pop, nhưng điều đó có vẻ khá thô. Bất kỳ cách tiếp cận tốt hơn?

Trả lời

2

Đây là một giải pháp khả thi:

  1. Trước khi chạy kịch bản bản quyền sửa đổi của bạn, làm một git status để có được một danh sách các tập tin đó là về để thực hiện. Lưu danh sách tệp. Thực hiện một cam kết.

  2. Sau đó, lưu phần còn lại của các thay đổi (không có liên quan) và áp dụng tập lệnh của bạn vào danh sách tệp được lưu ở trên. Sử dụng git commit --amend để thay đổi cam kết trước đó.

  3. Cuối cùng, hãy bật stash để khôi phục chỉ mục của bạn. Giải quyết xung đột nếu cần.

Tôi không biết cách nào để nói git add để chỉ thêm các dòng cụ thể. Bạn sẽ mô tả các dòng để thêm vào như thế nào? Theo số dòng? Có vẻ như điều đó có thể xảy ra trong một tình huống hẹp, và nói chung không hữu ích.

+0

Ah, cách tiếp cận gọn gàng, mặc dù cá nhân tôi muốn chờ cam kết. – Sandy

1

Bạn có thể vá phiên bản được phân đoạn của tệp theo một bước riêng biệt, ví dụ:

blobid=$(git show :"$filepath" | copyright-filter | git hash-object -w --stdin) 

if $? -eq 0; then 

    git update-index --cacheinfo 100644 "$blobid" "$filepath" && 
    copyright-filter "$filepath" 

fi 

Tôi không biết rằng kịch bản của bạn được gọi là copyright-filter và hoạt động như bộ lọc hoặc tại chỗ, tùy thuộc vào đối số của nó.

1

Nhìn vào nguồn tới git add --interactive có vẻ như cách nó sửa đổi chỉ mục là với git apply --cached. Giả sử bản quyền của bạn là hunk đầu tiên của bất kỳ diff, thực hiện thay đổi và sử dụng:

git diff -- file | 
awk 'second && /^@@/ {exit} /^@@/ {second=1} {print}' | 
git apply --cached 

đâu mà dòng thứ hai (kịch bản awk lấy chỉ hunk diff đầu tiên). Bạn cũng có thể xây dựng đầu ra diff bằng tay hoặc sử dụng các quy tắc khác để chọn hunk.

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