NotIf или Else условный gitconfig

После этого сообщения SO и связанное руководство, я настроил следующую конфигурацию условия...

$ cat ~/.gitconfig 
[user]
    name = Random J. Hacker
    email = [email protected]
[includeIf "gitdir:~/work/*"]
    path = ~/work/.gitconfig

$ cat ~/work/.gitconfig 
[user]
    name = Serious Q. Programmer
    email = [email protected]

Таким образом, все репозитории, которые я клонирую, когда работаю в Programmer Co., получают мой рабочий адрес электронной почты @programmer.biz в качестве --author учетных данных по умолчанию; и каждый случайный репозиторий, который я клонирую на свой рабочий стол или /tmp или ~/.vscode или куда-то еще, получает мои сверхзаконные учетные данные @hack.er, назначенные автором.

К сожалению, я заметил следующее поведение...

$ git clone [email protected]:programmerbiz/repo.git
$ cd repo/
$ git config --list | grep user
user.name=Random J. Hacker
[email protected]
user.name=Serious Q. Programmer
[email protected]

О, нет! Мой пользователь @hack.er попал в репозиторий!

Я хотел бы автоматически настроить один и только один [user] по умолчанию для всех репозиториев, не прибегая к сценарию bash. Есть ли оператор includeIf.Not, синтаксис блока [else] или аналогичный, который я могу использовать в ~/.gitconfig для достижения этой цели? документация по условному включению не поддерживает этот вариант использования.


person Peter Vandivier    schedule 30.07.2019    source источник
comment
Как насчет обычного раздела [user] с частью else, а затем раздела includeif с определенной частью, похоже, это работает, по крайней мере, в Windows.   -  person Lasse V. Karlsen    schedule 30.07.2019
comment
Вы пробовали includeIf, как описано здесь? stackoverflow.com/a/46239540/3216427   -  person joanis    schedule 30.07.2019
comment
Разве вы не можете определить его глобально как @fun.times и следовать за ним с помощью includeIf, который переопределяет имя и адрес электронной почты только тогда, когда это применимо? Иначе было бы неявно в предыдущих глобальных параметрах. Собственно, это именно то, что @Lasse предложил выше.   -  person joanis    schedule 30.07.2019
comment
Ах хорошо. Я получаю это сейчас. Было бы целесообразно отредактировать вопрос, чтобы упомянуть его там, поскольку не было ясно, что вы пробовали это, казалось бы, очевидное решение и что с ним не так. Интересный вопрос, надеюсь, кто-нибудь даст рабочий ответ.   -  person joanis    schedule 30.07.2019
comment
Следующий вопрос: когда я воспроизвел ваш сценарий, я также получил двойные учетные данные в git config --list, но когда я сделал git commit, он использовал правильные учетные данные. Мне кажется, что более позднее вхождение переопределяет более раннее, даже если git config --list по-прежнему перечисляет их обоих.   -  person joanis    schedule 30.07.2019
comment
@joanis git log также показывает последнего автора в очень беглом тестировании для меня. Учитывая существование коммитов с несколькими авторами 1 2, я бы не хотел, чтобы кешированные учетные данные просто болтались и надеялись< /i> чтобы его не подхватил какой-то процесс, который не должен его видеть.   -  person Peter Vandivier    schedule 30.07.2019
comment
Ну проблема в том, что нет еще или если нет, у тебя есть includeIf и все.   -  person Lasse V. Karlsen    schedule 30.07.2019
comment
@PeterVandivier Попробуйте git log --format=raw убедить себя, что это безопасно: согласно git log --help, необработанный формат показывает всю фиксацию точно так, как она хранится в объекте фиксации. С моей стороны, воспроизводя ваш сценарий, я вижу только рабочий идентификатор в своем тестовом коммите в папке work.   -  person joanis    schedule 31.07.2019


Ответы (2)


Что выводит git config --list --show-origin | grep user?
Вы должны увидеть, где определяются конфигурации.

Я хотел бы автоматически настроить одного и только одного [пользователя] по умолчанию для всех репозиториев.

В этом случае удалите все вышеуказанные настройки пользователей и установите одну запись в своей глобальной конфигурации.

# Use the `--global` to store it under your user account configuration
# and it will be used as the default for all of your projects unless you
# define it in your local `.git/config`

git config --global user.name <....>
git config --global user.email <....>

---- 
# For specific project use the `--local` flag (will be stored in your `.git/config`

git config --local user.name <....>
git config --local user.email <....>
person CodeWizard    schedule 30.07.2019
comment
Использование git config --local для каждого репо — это то, чего я пытался избежать с помощью условной глобальной конфигурации. +1 однако - я никогда не знал об опции --show-origin. Используя этот флаг, на самом деле похоже, что локальная установка [user] не перезаписывает глобальную настройку конфигурации по умолчанию, как я надеялся/ожидал. Возможно, мне нужно немного прочитать о приоритете атрибутов для репозиториев git. - person Peter Vandivier; 31.07.2019

Проблема в том, как вы указываете gitdir, у меня была такая же проблема, и путь (полный или относительный) должен заканчиваться косой чертой.

У вас есть gitdir:~/work/*

Вот как это должно выглядеть:

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

Затем вы можете перейти в каталог и проверить, сработало ли это:

cd ~/work
git config --list | grep user

Ваше здоровье!

person Willemoes    schedule 20.07.2020