Trong trường hợp bạn đang đi vào vấn đề này ngay bây giờ, tôi vừa mới xem qua hôm nay và có thể tóm tắt điều này đứng ở đâu. Nếu bạn chưa thử cách này, một số chi tiết ở đây có thể hữu ích.
Tôi nghĩ cách tiếp cận của @Omid Ariyan là cách tốt nhất. Thêm kịch bản cam kết trước và sau khi thanh toán. ĐỪNG quên đặt tên chính xác cho chúng theo cách Omid làm và ĐỪNG quên làm cho chúng có thể thực thi được. Nếu bạn quên một trong hai điều đó, chúng không có tác dụng gì và bạn chạy "git commit" lặp đi lặp lại và tự hỏi tại sao không có gì xảy ra :) Ngoài ra, nếu bạn cắt và dán ra khỏi trình duyệt web, hãy cẩn thận rằng dấu ngoặc kép và dấu tích không bị thay đổi.
Nếu bạn chạy tập lệnh cam kết trước một lần (bằng cách chạy git cam kết), thì tệp .permissions sẽ được tạo. Bạn có thể thêm nó vào kho lưu trữ và tôi nghĩ rằng không cần thiết phải thêm nó nhiều lần vào cuối tập lệnh pre-commit. Nhưng nó không đau, tôi nghĩ (hy vọng).
Có một số vấn đề nhỏ về tên thư mục và sự tồn tại của khoảng trắng trong tên tệp trong các tập lệnh của Omid. Khoảng trống là một vấn đề ở đây và tôi đã gặp một số rắc rối với bản sửa lỗi IFS. Đối với bản ghi, tập lệnh cam kết trước này đã hoạt động chính xác đối với tôi:
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
Bây giờ, chúng ta làm được gì từ điều này?
Tệp .permissions nằm ở cấp cao nhất của git repo. Nó có một dòng cho mỗi tệp, đây là ví dụ trên cùng của tôi:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Như bạn thấy, chúng tôi có
filepath;perms;owner;group
Trong các bình luận về cách tiếp cận này, một trong những người đăng bài phàn nàn rằng nó chỉ hoạt động với cùng một tên người dùng và điều đó đúng về mặt kỹ thuật, nhưng rất dễ sửa chữa. Lưu ý rằng kịch bản sau thanh toán có 2 phần hành động,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
Vì vậy, tôi chỉ giữ cái đầu tiên, đó là tất cả những gì tôi cần. Tên người dùng của tôi trên máy chủ Web thực sự khác nhau, nhưng quan trọng hơn là bạn không thể chạy chown trừ khi bạn root. Tuy nhiên, có thể chạy "chgrp". Nó là đủ rõ ràng làm thế nào để sử dụng nó.
Trong câu trả lời đầu tiên của bài đăng này, câu trả lời được chấp nhận rộng rãi nhất, đề xuất là nên sử dụng git-cache-meta, một tập lệnh đang thực hiện công việc giống như các tập lệnh hook trước / sau (phân tích cú pháp đầu ra từ git ls-files
) . Đối với tôi, các tập lệnh này dễ hiểu hơn, mã git-cache-meta khá phức tạp hơn. Có thể giữ git-cache-meta trong đường dẫn và viết các tập lệnh pre-commit và post-checkout sẽ sử dụng nó.
Khoảng trắng trong tên tệp là một vấn đề với cả hai tập lệnh của Omid. Trong tập lệnh sau thanh toán, bạn sẽ biết mình có khoảng trắng trong tên tệp nếu bạn gặp lỗi như thế này
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
Tôi đang kiểm tra các giải pháp cho điều đó. Đây là một cái gì đó có vẻ hoạt động, nhưng tôi chỉ thử nghiệm trong một trường hợp
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
Vì thông tin về quyền là một dòng tại một thời điểm, tôi đặt IFS thành $, vì vậy chỉ những dấu ngắt dòng được xem là những thứ mới.
Tôi đọc rằng điều RẤT QUAN TRỌNG là đặt biến môi trường IFS trở lại như cũ! Bạn có thể thấy lý do tại sao một phiên shell có thể trở nên tồi tệ nếu bạn để $ làm dấu phân tách duy nhất.