2012-02-24 26 views
16

Tôi đã tìm kiếm các bản sao và trong khi một số có tiêu đề tương tự, tôi chưa tìm thấy bất kỳ ai gặp vấn đề giống như tôi, vì vậy tại đây đi.Cách thêm tập tin vào chỉ mục trong móc trước git

Tôi đã viết một tập lệnh chạy trên pre-commit và sử dụng đầu ra của git status --porcelain để biên dịch bất kỳ tệp LESS nào trong dự án của tôi đã thay đổi. Phần này hoạt động tốt. Nhưng tôi muốn các tệp .css được bao gồm trong cam kết hiện tại. Vì vậy, ngoài việc chạy trình biên dịch, tập lệnh của tôi chạy git add <filename>. Và đây là nơi mọi thứ trở nên phức tạp.

Tệp được thêm vào chỉ mục nhưng không phải là chỉ mục của cam kết hiện tại. Vì vậy, nếu tôi sửa đổi style.less và chạy git commit -a (hoặc thủ công git add style.less) trình biên dịch sẽ tạo ra style.cssstyle.min.css và thêm chúng vào cam kết hiện tại. Nhưng hành vi mà tôi đã nhận thấy chỉ là style.less được cam kết, mặc dù hai tệp .css được thêm vào chỉ mục cho lần commit tiếp theo.

Vì vậy, câu hỏi của tôi là: có cách nào để thêm tệp vào cam kết trong móc trước khi cam kết để chúng có hiệu lực cho cam kết đó không? Lưu ý rằng trước khi hook pre-commit được chạy, hai tệp .css này không được sửa đổi, vì vậy tôi không thể thêm chúng trước đó. Tôi cũng biết tôi có thể thoát khỏi móc với một tình trạng khác không để cam kết bị hủy bỏ nhưng các tập tin được thêm vào, nhưng tôi hy vọng để tránh điều đó. Bất kỳ ý tưởng tốt hơn?

Trả lời

-3

Tại sao bạn muốn thực hiện điều này ngay từ đầu? Bạn đang cố gắng đưa các tệp được tạo vào điều khiển phiên bản, đó là một ý tưởng không tốt. Nếu bạn cần style.min.css ở đó khi thanh toán, tại sao bạn không thể tạo nó sau khi thanh toán trong bước xây dựng?

+0

Vì tệp CSS không phải là tệp nhị phân, chúng chỉ là các tệp văn bản tĩnh. Các tệp được tạo không được đặt trong điều khiển phiên bản vì chúng thường gây xung đột hợp nhất nơi bạn không thực sự có cách tốt để giải quyết chúng (tệp nhị phân), nhưng đối với tệp CSS bạn hiếm khi gặp sự cố đó. Tôi không muốn phải cài đặt một trình biên dịch LESS trên máy chủ web của chúng tôi để làm điều đó sau khi hợp nhất/cập nhật. Tuy nhiên, tất cả những gì đã nói, nó đã chứng minh được một cách dễ dàng hơn để hoàn thành những gì tôi đã cố gắng làm, mặc dù nó không phải là lý tưởng. –

+1

Tại sao đây là câu trả lời được chấp nhận? Điều này không giải quyết được vấn đề gì cả. – frhd

+1

Tôi đoán anh ấy đã chấp nhận câu trả lời của tôi là "bạn làm sai", bởi vì trong trường hợp này nó giải quyết được vấn đề của anh ta (cho là không trả lời câu hỏi của anh ta). Nếu anh ta không kiểm tra các tập tin LESS ở nơi đầu tiên, các "làm thế nào để tôi slipstream chúng vào cam kết" vấn đề biến mất. – plaugg

0

Nó xảy ra với tôi rằng bạn có thể có thuộc tính git 'sạch' là một tập lệnh cập nhật các tệp được tạo. Thông thường, hook có thể chạy một script để dọn dẹp mã nguồn của bạn nhưng tôi nghĩ nó có thể được sử dụng để "dọn dẹp" đầu ra được sinh ra của bạn. Thuộc tính này được kích hoạt khi bạn thực hiện 'git add' và bạn có thể có tập lệnh thực hiện lệnh 'git add' khác trên tệp được tạo.

+0

Bạn có thể giải thích thêm về điều đó không? Tôi đã làm một số Googling và tìm thấy một số thông tin về Git thuộc tính nhưng không có gì về cách đính kèm một kịch bản cho họ hoặc làm thế nào một 'add' thuộc tính có thể được đặt ra. –

0

Bạn có thể tận dụng lợi thế của việc sửa đổi cam kết cuối cùng. Chỉ là một ý tưởng.

+0

Tôi đã xem xét tùy chọn này, nhưng tôi hy vọng sẽ tránh được nó. Nó liên quan đến việc chạy một commit, chạy hook, sau đó để commit ban đầu kết thúc và sau đó chạy commit thứ hai (trừ khi tôi thiếu một cái gì đó), điều này có vẻ phức tạp để thực hiện thủ công, và vô lý để tự động thực hiện bằng hook. –

+0

Mặc dù khi tự động chạy bằng móc, nó sẽ thực hiện công việc một cách hoàn hảo. – Xobb

10

Tôi không thể tái tạo sự cố của bạn. Dự đoán ban đầu của tôi là biến môi trường GIT_INDEX_FILE đã không được đặt bởi móc pre-commit của bạn. Tuy nhiên, khi tôi thử xóa GIT_INDEX_FILE từ pre-commit, tôi gặp vấn đề khác (Git phàn nàn rằng .git/index đã bị khóa).

Dưới đây là một tập lệnh mẫu cho thấy chức năng của Git như bạn mong đợi và một điều gì đó khác phải sai. Kịch bản này khởi tạo một kho lưu trữ thử nghiệm mới, tạo ra một cái móc pre-commit rằng mô phỏng những gì móc của bạn không, và làm cho một vài thử nghiệm cam kết:

#!/bin/sh 

# initialize the test repository 
rm -rf testrepo 
git init testrepo 
cd testrepo 

# create the pre-commit hook 
cat <<\EOF >.git/hooks/pre-commit 
#!/bin/sh 
git status --porcelain | while IFS= read -r line; do 
    # todo: handle renames and deletions of a *.less file 
    f=${line#???} 
    case ${f} in 
     *.less) 
      fb=${f%.less} 
      echo bar >>"${fb}".css 
      echo baz >>"${fb}".min.css 
      git add "${fb}".css "${fb}".min.css 
      ;; 
    esac 
done 
EOF 
chmod +x .git/hooks/pre-commit 

# create foo.less, commit it 
echo foo >foo.less 
git add foo.less 
git commit -m "add foo.less" 

# modify foo.less, commit it 
echo foo2 >>foo.less 
git commit -a -m "modify foo.less" 

Nếu bạn chạy git log -p trong kho kiểm tra và xem xét các kết quả cam, bạn' sẽ thấy rằng foo.cssfoo.min.css được sửa đổi bất cứ khi nào foo.less được sửa đổi.

Dưới đây là lý do tại sao tôi nghĩ vấn đề của bạn là do thay đổi/unsetting biến GIT_INDEX_FILE môi trường:

Khi git commit -a đang chạy, Git làm cho một tập tin chỉ số tạm thời và sử dụng rằng thay vì mặc định .git/index để tạo ra các cam kết. Để hoạt động như git add hoạt động từ trong móc pre-commit, Git đặt biến môi trường GIT_INDEX_FILE thành tên của chỉ mục tạm thời mà nó đã tạo trước khi chạy pre-commit.Nếu móc của bạn bỏ chọn GIT_INDEX_FILE hoặc đặt thành .git/index, thì tất cả các thao tác Git từ trong móc của bạn sẽ cố gắng sửa đổi chỉ mục gốc, không phải chỉ mục tạm thời được sử dụng để tạo cam kết.

Tuy nhiên, tệp chỉ mục tạm thời cũng hoạt động như một khóa trên tệp chỉ mục gốc. Nếu một cái móc cố sửa đổi chỉ mục gốc và chỉ mục tạm thời tồn tại, thì Git sẽ hủy bỏ lỗi.

+0

Tôi chạy tập lệnh của bạn và nó hoạt động như mong đợi, trái với cách kho lưu trữ thực sự của tôi thực sự hoạt động như thế nào. Tôi sẽ xem xét điều này một chút sau đó và lấy lại cho bạn nếu tôi tìm ra điều gì đó. Cảm ơn! –

+0

Đã cho bạn tiền thưởng vì nỗ lực, mặc dù tôi vẫn không thể tìm ra những gì đang diễn ra. Cảm ơn một lần nữa! –

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