Cấu hình git có thể được đặt trên nhiều kho lưu trữ không?


18

Git dường như hỗ trợ các giá trị cấu hình ở ba cấp độ:

  • Cài đặt toàn cầu trên toàn hệ thống (được lưu trữ trong /etc/git-core)
  • Cài đặt toàn cầu cho mỗi người dùng (được lưu trữ trong ~/.gitconfig)
  • Cài đặt cục bộ trên mỗi kho lưu trữ (được lưu trữ trong $REPO/.git/config)

Các tùy chọn này bao gồm hầu hết các cơ sở nhưng tôi đang tìm cách để xử lý cấp độ thứ tư. Tôi có một bộ sưu tập lớn (rất) mà tôi cần sử dụng một giá trị khác user.emailso với thông thường. Các kho lưu trữ này thường được tạo và thao tác thông qua các tập lệnh tự động và việc thiết lập cho mỗi cài đặt cục bộ của kho lưu trữ rất cồng kềnh.

Tất cả các kho lưu trữ trong câu hỏi được đặt dưới một tiền tố đường dẫn nhất định trên hệ thống cục bộ của tôi. Có cách nào để đặt giá trị cấu hình ở đâu đó sẽ được kế thừa bởi tất cả các kho lưu trữ theo đường dẫn đó không? (Sắp xếp các .htaccesscài đặt giống như kế thừa tất cả các cách lên hệ thống tệp.) Có lẽ sẽ có cách để đặt các giá trị có điều kiện trong tệp cấu hình chung? Những sự sắp xếp nào khác có thể được thực hiện trong môi trường UNIX để đối phó với một bộ các kho lưu trữ như của tôi?


Phản xạ đầu tiên của tôi là hack các script để tinh chỉnh .gitconfigtrong mỗi thư mục mà chúng tạo ra. Ví dụ, repo của IIRC Android có thể làm điều này, nhưng bạn phải đọc kỹ nguồn để tìm hiểu. (Tôi không hoàn toàn chắc chắn, tôi đã không làm điều đó trong một thời gian.)
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Đó chắc chắn là một khả năng. Các repos trong câu hỏi là kho lưu trữ gói cho một bản phân phối Linux gần đây đã di chuyển từ CVS sang Git. Chúng tôi vẫn đang làm việc để làm lại tất cả các dụng cụ của chúng tôi. Về lâu dài có lẽ là nơi điều này được khắc phục, nhưng trong ngắn hạn, những người trong chúng ta đang làm việc với nó đang thử nghiệm xem các tùy chọn là gì.
Caleb

Câu trả lời:


11

Tôi đã tìm thấy không có cách nào để cấu hình git ở cấp độ thứ tư này. Cách duy nhất có vẻ là giá trị cấu hình cho mỗi lệnh ghi đè bằng cách sử dụng git -c key=value.

Giải pháp hacky hiện tại của tôi là xác định hàm shell đóng vai trò là trình bao bọc cho git. Khi được gọi, nó chuyển các đối số vào lệnh git hệ thống, nhưng không phải trước khi kiểm tra thư mục làm việc hiện tại và thêm một đối số phụ vào lệnh nếu có.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

Tôi có thể làm gì command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"hay tôi nên làm thế nào? Tìm kiếm cao & thấp và tham chiếu duy nhất cho cờ -c này tôi tìm thấy là của bạn, cảm ơn, đánh giá cao.
Vic Goldfeld

cho hồ sơ, tôi đã làm cho nó hoạt động vớicommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld

6

Bạn có thể cấu hình địa chỉ email cho git với biến môi trường GIT_AUTHOR_EMAIL. Nếu bạn kết hợp điều này với Execute bash scripts khi nhập cấu hình shell của thư mục hoặc thư mục cụ thể với zsh, bạn có thể dễ dàng thay đổi cài đặt cho mỗi thư mục hoặc thư mục cha, ví dụ: nếu bạn nhập vào một thư mục trong ~/workbạn có thể tự động điều chỉnh các biến môi trường để thay đổi email của mình địa chỉ nhà.


2

Xem giải pháp dựa trên cấu hình git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multipl-reposeocate/

Thêm vào tập tin ~ / .gitconfig.

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

Tạo tập tin ~ ~ .gitconfig-project1 with có nội dung:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

Vị từ "bao gồm" giúp tiết kiệm cơn đau đầu của tôi!
Trương Nguyễn

1

Dựa trên câu trả lời của Caleb, chúng ta có thể xác định một gitlệnh đã sửa đổi , cấu hình vĩnh viễn tất cả các kho lưu trữ trong thư mục này, để tất cả các lần sử dụng vanilla git trong tương lai sẽ sử dụng cấu hình mới. Tôi sử dụng hub, đó là một trình bao bọc git khác, vì vậy tôi đã thay thế nó alias git=hubbằng hàm này và được gọi hubtrong hàm của tôi - nếu bạn không sử dụng hub, hãy thay thế tất cả các lệnh hubbằng command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

Không giống như câu trả lời của Caleb, chỉ hoạt động trong một vỏ (và trừ khi có nguồn gốc rõ ràng, chỉ trong một vỏ tương tác), điều này cũng ảnh hưởng đến các giao diện git khác đọc chính xác cấu hình git, chẳng hạn như ma thuật emacs.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.