Có thể có cấu hình Git khác nhau cho các dự án khác nhau?


315

.gitconfigthường được lưu trữ trong user.homethư mục.

Tôi sử dụng một danh tính khác để làm việc cho các dự án cho Công ty A và một cái gì đó khác cho Công ty B (chủ yếu là tên / email). Làm cách nào tôi có thể có hai cấu hình Git khác nhau để đăng ký của tôi không đi cùng với tên / email?

Câu trả lời:


264

Các .git/config tập tin trong một bản sao cụ thể của một kho lưu trữ là cục bộ của bản sao đó. Bất kỳ cài đặt nào được đặt ở đó sẽ chỉ ảnh hưởng đến các hành động cho dự án cụ thể đó.

(Theo mặc định, git configsửa đổi .git/config, không ~/.gitconfig- chỉ với --globalnó sửa đổi cái sau.)


Vì vậy, việc sửa đổi tệp cấu hình trong cấu hình cho chính repo, ví dụ như [user] email = ...khối thay đổi , sẽ ghi đè toàn cục ~/.gitconfig- và điều này chỉ dành cho người dùng của bạn?
dcsan

284

Có 3 cấp độ cấu hình git; dự án, toàn cầu và hệ thống.

  • dự án : Cấu hình dự án chỉ khả dụng cho dự án hiện tại và được lưu trữ trong .git / config trong thư mục của dự án.
  • toàn cầu : Cấu hình toàn cầu có sẵn cho tất cả các dự án cho người dùng hiện tại và được lưu trữ trong ~ / .gitconfig.
  • system : Cấu hình hệ thống có sẵn cho tất cả người dùng / dự án và được lưu trữ trong / etc / gitconfig.

Tạo một cấu hình cụ thể của dự án, bạn phải thực hiện điều này trong thư mục của dự án:

$ git config user.name "John Doe" 

Tạo cấu hình toàn cầu:

$ git config --global user.name "John Doe"

Tạo cấu hình hệ thống:

$ git config --system user.name "John Doe" 

Và như bạn có thể đoán, dự án sẽ ghi đè hệ thống ghi đè toàn cầu và toàn cầu.


69
Có khả năng để thực hiện một số cấu hình "thư mục"? Tôi làm một số công việc ở nhà và có các thư mục với các dự án công việc và của riêng tôi. Vì vậy, tôi đã nhận được các thư mục ~ / job và ~ / my với git repos và muốn các cấu hình khác nhau cho các dự án theo chúng. Ví dụ: job / project1 có cấu hình từ job / .gitconfig.
Serge

2
@Serge bạn đã bao giờ tìm ra nếu có thể tạo một cấu hình cấp thư mục? Tôi có cùng một vấn đề ngay bây giờ.
Đặt câu hỏi

2
Không, tôi đặt cấu hình hệ thống tổng thể thành dữ liệu cá nhân và tạo tập lệnh bash để đặt dữ liệu công việc thành các cấu hình dự án nhất định trong một lệnh.
Serge

1
Là một phụ lục: chỉ git config user.namehoặc git config user.emailsẽ hiển thị cho bạn tên hoặc email mà Git sẽ sử dụng cho kho lưu trữ hiện tại.
Abhishek Divekar

1
Tôi đã kết thúc việc này cho zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , tôi hy vọng điều này sẽ giúp được ai đó.
pgarciacamou

219

Kể từ phiên bản git 2.13, git hỗ trợ cấu hình có điều kiện bao gồm . Trong ví dụ này, chúng tôi sao chép các repos của Công ty A trong ~/company_athư mục và các repos của Công ty B trong ~/company_b.

Trong của .gitconfigbạn, bạn có thể đặt một cái gì đó như thế này.

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

Nội dung ví dụ về .gitconfig-company_a

[user]
name = John Smith
email = john.smith@companya.net

Nội dung ví dụ về .gitconfig-company_b

[user]
name = John Smith
email = js@companyb.com

1
Thật tuyệt khi thấy điều này đã được thêm vào trong phiên bản 2.13. Tôi đã sử dụng github.com/bddenhartog/git-profiles trong một thời gian, nhưng không thể làm cho nó hoạt động với Tower.
adrum

4
bao gồmNếu hơi khó tính, hãy xem: stackoverflow.com/questions/43919191/ trên
rúp

Trang tài liệu bạn liên kết đến không đề cập đến điều này ... trên thực tế, tìm kiếm bao gồm Nếu không mang lại bất kỳ kết quả nào trong tài liệu
Thomas Levesque

1
@ThomasLevesque Thật kỳ lạ. Tôi chắc chắn rằng nó đã nói điều gì đó về nó trước đây. Bạn có thể tìm thấy nó trong changelog github.com/git/git/blob/master/Documentation/RelNotes/... và cũng qua tại kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust bạn cần cài đặt git> = 2.13 (Ubuntu 16.04 có git 2.7) . Nhận phiên bản mới nhất của git qua Git PPA và nó sẽ hoạt động :)
Cas

24

Cảm ơn @ crea1

Một biến thể nhỏ:

Như nó được viết trên https://git-scm.com/docs/git-config#_includes :

Nếu mô hình kết thúc bằng /, **sẽ được tự động thêm vào. Ví dụ, mô hình foo/trở thànhfoo/** . Nói cách khác, nó phù hợp foovà mọi thứ bên trong, đệ quy.

Vì vậy, tôi sử dụng trong trường hợp của mình,
~ / .gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

Vì vậy, nếu thư mục dự án nằm trong của tôi ~/wokspace/, cài đặt người dùng mặc định sẽ được thay thế bằng
~ / .gitconfig-w :

[user]
name = John Smith
email = js@company.com

Xong việc này, bây giờ tên người dùng và email chính xác được đặt trong các thư mục khác nhau. Khi tôi thực hiện git config user.name / git config user.email tôi nhận được thông tin chi tiết chính xác. Nhưng khi tôi nhận xét trong repo cá nhân, nó luôn chọn email tên người dùng chính thức toàn cầu
Bhupendra

@Bhupendra Trong mẫu của tôi, .gitconfig và .gitconfig-job nằm trong nhà của tôi, không phải trong các thư mục dự án. Bạn có cần nhiều hơn hai? Bạn có tạo một .gitconfig-Alternativ trong thư mục chính của bạn, như .gitconfig-job trong mẫu của tôi, với 3 dòng.
bcag2

@ bcag2 Tôi cũng làm theo ví dụ tương tự ở trên. Tôi có 2 cấu hình làm việc mặc định và cá nhân tương tự như gitconfig-job. Khi tôi ở trong thư mục cá nhân, trên git config user.name cho tôi tên chính xác nhưng để đẩy cam kết, nó sẽ lấy tên mặc định trong khi tôi cần tên cá nhân.
hoán đổi2993

@ exchangenil2993 trước tiên tôi nghĩ ở vấn đề đường dẫn nhưng nếu git config user.nametrả về đúng, nó sẽ ổn thôi. Bạn có thuộc GNU / Linux hoặc HĐH khác không?
bcag2

@ bcag2 Đã giải quyết vấn đề. Chỉ cần sửa đường dẫn. Nhưng git config user.name trả về giá trị đúng là lạ. Cảm ơn câu trả lời.
hoán đổi2993

14

Để rõ ràng, bạn cũng có thể sử dụng --localđể sử dụng tệp cấu hình kho lưu trữ hiện tại :

git config --local user.name "John Doe" 

12

Bạn cũng có thể trỏ biến môi trường GIT_CONFIGvào một tệp git confignên sử dụng. Với GIT_CONFIG=~/.gitconfig-A git config key valuecác tập tin được chỉ định được thao tác.


2
Mát mẻ; với một chút phép thuật vỏ thông minh, điều này có thể được sử dụng để thiết lập mọi thứ để git chọn .gitconfig đầu tiên mà nó tìm thấy khi đi qua cây dir lên trên repo hiện tại. Cảm ơn!
ecmanaut

1
Bạn có một liên kết đến ma thuật vỏ này làm điều này? Âm thanh hữu ích!
pchiusano

1
@pchiusano đây là phiên bản thô sơ của nó trong cá github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/
Lỗi

Cảm ơn bạn vì một giải pháp đơn giản chỉ yêu cầu thay đổi một biến môi trường.

nó chỉ ảnh hưởng đến lệnh cấu hình git tại github.com/git/git/blob/master/Documentation/RelNotes/...
foray1010

12

Tôi đang làm điều này cho email của mình theo cách sau:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

Sau đó, khi tôi sao chép một dự án công việc mới, tôi chỉ phải chạy git hobbyprofilevà nó sẽ được cấu hình để sử dụng email đó.


3

Một cách khác là sử dụng direnv và tách các tệp cấu hình cho mỗi thư mục. Ví dụ:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

Mỗi .envrccái nên chứa một cái gì đó như thế này:

export GIT_CONFIG=$(pwd)/.gitconfig

.gitconfiglà gitconfig thông thường với các giá trị mong muốn.


2

Bạn có thể tùy chỉnh cấu hình Git của dự án bằng cách thay đổi tệp cấu hình cụ thể của kho lưu trữ (nghĩa là /path/to/repo/.git/config). BTW, git configghi vào tệp này theo mặc định:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

Tôi thích tạo hồ sơ riêng cho các dự án khác nhau (ví dụ: trong ~/.gitconfig.d/) và sau đó đưa chúng vào tệp cấu hình của kho lưu trữ:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

Điều này hoạt động tốt nếu bạn cần sử dụng cùng một bộ tùy chọn trong nhiều repos thuộc về một dự án. Bạn cũng có thể thiết lập bí danh shell hoặc lệnh Git tùy chỉnh để thao tác các cấu hình.


0

Tôi ở trên cùng một con thuyền. Tôi đã viết một kịch bản bash nhỏ để quản lý chúng. https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

Kịch bản của bạn ở đây là Bash, trong khi trên Github, bạn có phiên bản Python. Cũng -skhông được xử lý trong tập lệnh Bash của bạn.
Vadim Kotov

0

Tôi đã có một lỗi khi cố gắng git stashthay đổi cục bộ của tôi. Lỗi từ git đã nói "Vui lòng cho tôi biết bạn là ai" và sau đó bảo tôi "Chạy git config --global user.email "you@example.comgit config --global user.name "Your name"đặt danh tính mặc định của tài khoản của bạn." Tuy nhiên, bạn phải Omit --global để chỉ nhận dạng danh tính trong kho lưu trữ hiện tại của bạn.

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.