Изменение расположения .gitconfig в Windows

105

По умолчанию в Windows Git помещает глобальный файл .gitconfig в c:\documents and settings\user\

Как я могу изменить эту позицию, чтобы сохранить .gitconfig c:\my_configuration_files\?

Можно ли это вообще сделать?

Ладья
источник
Просто хотел добавить, что тоже сталкиваюсь с этим. У меня есть все остальные мои глобальные настройки git (exludesfiles и attrirutesfile) в% userprofile% /. Git / .gitignore (так что в папке), но .gitconfig мне бы хотелось, чтобы он сидел рядом с ними , но он должен находиться в корне% userprofile% ... это действительно раздражает.
WORMSS
6
Есть ли прогресс после того, как был задан вопрос? Мой .gitconfig по умолчанию находится на сетевом диске, что означает, что он не может его прочитать, когда я не в сети.
Lech Rzedzicki

Ответы:

67

Если вы установите HOMEзначение c:\my_configuration_files\, то git найдет там .gitconfig. Здесь описано редактирование переменных среды . Вам нужно установить переменную HOME, а затем повторно открыть любое окно cmd.exe. Используйте команду «set», чтобы убедиться, что HOME действительно указывает на правильное значение.

Изменение HOME, конечно же, повлияет и на другие приложения. Однако после чтения исходного кода git это кажется единственным способом изменить расположение этих файлов без необходимости настраивать командную строку. Вы также должны принять во внимание ответ Стефана: вы можете установить переменную GIT_CONFIG. Однако, чтобы добиться желаемого эффекта, вам необходимо передать --globalфлаг всем вызовам git (плюс все локальные файлы .git / config игнорируются).

Мартин против Лёвиса
источник
2
Хм, не уверен, правильно ли я понял, но не повлияет ли изменение HOME на все другие приложения, которые его используют? Разве нет способа изменить HOME, кроме локального в Git?
Ладья
Да, это повлияет и на другие приложения. Вы спросили, как изменить местоположение, и я вам сказал. Смотрите мою правку.
Мартин против Лёвиса,
10
У кого-нибудь действительно есть это, чтобы работать без побочных эффектов перемещения ДОМАШНИЙ, испорченного целой кучей других вещей?
Ade Miller
Скорее всего, это решение, которое работает на платформе Windows. Это сработало и для меня. Я использовал сценарий refreshenv Chocolatey, чтобы обновить установленную мной переменную окружения HOME (переменная окружения пользователя). После этого я получил желаемое расположение файла.
Tore Aurstad
Мне пришлось переустановить Git, чтобы это работало. Если бы я просто добавил новую переменную среды с именем HOME и переместил .gitconfigфайл в этот каталог, это не сработало.
Csa77
46

Изменить HOME каталог, так как это неправильно. Лучше создать символическую ссылку для gitconfig на HOME каталог.

  1. Переместите ваш .gitconfig из домашнего каталога пользователя в нужный каталог.
  2. Запустить командную строку от имени администратора
  3. Перейдите в домашний каталог пользователя
  4. Введите mklink .gitconfig \ PathForNewLocationOfConfig.gitconfig.
MicTech
источник
9
Возможно, стоит добавить, что если вы запустите git config --global, чтобы добавить элемент в свою конфигурацию, ваша символическая ссылка будет перезаписана фактической копией используемого .gitconfig. Я столкнулся с этой проблемой при тестировании места, где \ PathForNewLocationOfConfig.gitconfig была моей папкой Dropbox
MotoWilliams
8
Если ваш .gitconfig расположен на сетевом диске, вы можете получить сообщение «Устройство не поддерживает символические ссылки», которое исключает эту опцию.
полдень и
4
Не думаю, что это решение кому-то подойдет. В нашей компании $HOMEнаходится на сетевом диске, и всякий раз, когда возникает проблема с сетевым подключением, ссылка недоступна.
andreee
1
@MotoWilliams пересматривает это в 2017 году: символическая ссылка остается нетронутой после редактирования с помощью --global
Snake
2
Здесь групповая полиция (AD) устанавливает HOMEDRIVE, HOMEPATH и HOMESHARE, но не простой, старый, простой ДОМ. В отсутствие HOME git, похоже, использует некоторую комбинацию трех предыдущих. Но установка HOME (с помощью обычной методологии установки переменных среды для конкретного пользователя) работает: GIT использует значение HOME, которое вы установили, а grouppolicy не сбивает HOME.
Дэвид И. МакИнтош
29

Я решил эту проблему, используя несколько иной подход, который, как я видел, работает для других файлов конфигурации. Git Config поддерживает включает в себя , что позволяет указать в конфигурационный файл в другом месте. Затем это альтернативное местоположение импортируется и расширяется на месте, как если бы оно было частью файла .gitconfig. Итак, теперь у меня есть только одна запись в .gitconfig:

[include]
   path = c:\\path\\to\\my.config

Любые обновления, записанные Git в файл .gitconfig, не будут перезаписывать мой путь включения. Это означает, что иногда мне может понадобиться перенести значения из .gitconfig в my.config.

Джо Бринкман
источник
+1: никаких странных конфигураций, и мой глобальный gitconfig - это то, что я храню в самом репозитории git, поэтому следить за тем, что там есть, - моя работа. При внесении глобальных изменений я просто редактирую глобальный файл вручную. Так что это отлично работает для меня и не требует никаких странностей вроде изменения переменной окружения "HOME", что является странной идеей только для того, чтобы получить конфигурацию Git там, где вы хотите. В конце концов, домашний каталог имеет другое значение для многих других программ. Кроме того, с помощью этого решения вы можете поместить другой идентификатор вверху и сохранить одинаковые ключевые настройки для всех идентификаторов. Превосходно!
user62177541
2
Интересно, можно ли вместо этого записать конфигурацию git в файл [include] d.
Джонатан Назарио
1
@JonathanNazariogit config --file "included.file"
Перо П.
11

Я не мастер Git, но поиском решения, которое сработало для меня, было просто перейти в текстовый редактор C:\Program Files (x86)\Git\etcи открыть profileего.

В ifстроке 37 есть заявление # Set up USER's home directory. Я вынул ifинструкцию и поместил в локальный каталог, в котором должен был находиться gitconfig, затем я просто скопировал свой существующий файл gitconfig (находился на сетевом диске) в это место.

Scottsandersdev
источник
Благодаря тонну. В то время как все другие варианты не помогли мне, это просто сэкономило мне миллион операторов git, умноженных на 6 секунд: D вот что я сделал ... `HOME =" $ USERPROFILE \ Downloads \ Tools \ Git_Config "`
PravyNandas
2
Слово 'home' (или что-то похожее на вашу строку: 37) больше не существует в git 2.24 (декабрь 2019 г.).
Фрэнк
6

Для меня изменение начального местоположения (по крайней мере, git-gui) не повлияло на то, где он искал .gitconfig. Моя установка на работе монтирует U: для нашего дома, но у нас нет разрешения писать в U: напрямую, только подкаталоги, которые были созданы для нас внутри, так что это было для меня нарушением сделки.

Я решил проблему, создав пакетный сценарий, который переопределил бы переменные окружения HOMEDRIVE и HOMEPATH только для этого приложения. Затем изменил ярлык в меню «Пуск», чтобы вместо этого указывать на этот пакетный сценарий.

Брайан Блэкберн
источник
1
Я хотел бы получить дополнительную информацию о том, что вы сделали, чтобы исправить это.
Мэтт Касто
Вы можете поделиться своим решением?
Сал
4

Сначала проверьте настройку HOME, затем измените HOME и HOMEDRIVE на существующий каталог.

c:\git>set HOME
HOME=U:\
HOMEDRIVE=U:
HOMEPATH=\

затем измените HOME и HOMEDRIVE на

set HOME=c:\tmp
set HOMEDRIVE=C:
Алити
источник
3

Если вы работаете в Windows и у вас возникли проблемы с изменением переменных среды или mklinkиз-за недостаточных прав, простое решение вашей проблемы - запустить git batch в другом месте.

Просто щелкните правой кнопкой мыши Git Bash.exe, выберите «Свойства» и измените свойство «Начать в» на c:\my_configuration_files\.

ЖирАльберт
источник
Ничего себе, это работает с легкостью. Создал новый %HOMEDRIVE%%HOMEPATH%ярлык и в разделе «Свойства-> начать в» изменился на «c: \ my_repo_folder». Сработал шарм.
Шейн
2
У меня это не сработало. Файл .gitconfig все еще был загружен из моего домашнего каталога
Dave B
3

Я хотел сделать то же самое. Лучшее, что я смог найти, - это решение @MicTech. Однако, как указывает @MotoWilliams, это не переживает никаких обновлений, сделанных Git для файла .gitconfig, который заменяет ссылку новым файлом, содержащим только новые настройки.

Я решил эту проблему, написав следующий сценарий PowerShell и запустив его в сценарии запуска своего профиля. При каждом запуске он копирует любые настройки, которые были добавлены в пользовательский .gitconfig, в глобальный, а затем заменяет весь текст в файле .gitconfig заголовком и [include], который импортирует глобальный файл.

Я храню глобальный файл .gitconfig в репозитории вместе с множеством других глобальных скриптов и инструментов. Все, что мне нужно сделать, это не забыть отметить все изменения, которые скрипт добавляет в мой глобальный файл.

Для меня это работает довольно прозрачно. Надеюсь, поможет!

9 сентября: Обновлено, чтобы определять, когда новые записи, добавленные в файл конфигурации, дублируются, и игнорировать их. Это полезно для таких инструментов, как SourceTree, которые будут писать новые обновления, если они не могут найти существующие и не следуют включенным.

function git-config-update
{
  $localPath = "$env:USERPROFILE\.gitconfig".replace('\', "\\")
  $globalPath = "C:\src\github\Global\Git\gitconfig".replace('\', "\\")

  $redirectAutoText = "# Generated file. Do not edit!`n[include]`n  path = $globalPath`n`n"
  $localText = get-content $localPath

  $diffs = (compare-object -ref $redirectAutoText.split("`n") -diff ($localText) | 
    measure-object).count

  if ($diffs -eq 0)
  {
    write-output ".gitconfig unchanged."
    return
  }

  $skipLines = 0
  $diffs = (compare-object -ref ($redirectAutoText.split("`n") | 
     select -f 3) -diff ($localText | select -f 3) | measure-object).count
  if ($diffs -eq 0)
  {
    $skipLines = 4
    write-warning "New settings appended to $localPath...`n "
  }
  else
  {
    write-warning "New settings found in $localPath...`n "
  }
  $localLines = (get-content $localPath | select -Skip $skipLines) -join "`n"
  $newSettings = $localLines.Split(@("["), [StringSplitOptions]::RemoveEmptyEntries) | 
    where { ![String]::IsNullOrWhiteSpace($_) } | %{ "[$_".TrimEnd() }

  $globalLines = (get-content  $globalPath) -join "`n"
  $globalSettings =  $globalLines.Split(@("["), [StringSplitOptions]::RemoveEmptyEntries)| 
    where { ![String]::IsNullOrWhiteSpace($_) } | %{ "[$_".TrimEnd() }

  $appendSettings = ($newSettings | %{ $_.Trim() } | 
    where { !($globalSettings -contains $_.Trim()) })
  if ([string]::IsNullOrWhitespace($appendSettings))
  {
    write-output "No new settings found."
  }
  else
  {
    echo $appendSettings
    add-content $globalPath ("`n# Additional settings added from $env:COMPUTERNAME on " + (Get-Date -displayhint date) + "`n" + $appendSettings)
  }
  set-content $localPath $redirectAutoText -force
}
Аде Миллер
источник
2

Как человек, который интересовался этим ОЧЕНЬ ДОЛГО ВРЕМЯ. См. Из руководства:

$ XDG_CONFIG_HOME / git / config - Второй файл конфигурации для конкретного пользователя. Если $XDG_CONFIG_HOMEне задан или пуст, будет использоваться $ HOME / .config / git / config. Любая однозначная переменная, установленная в этом файле, будет перезаписана тем, что находится в ~ / .gitconfig. Не создавайте этот файл, если вы иногда используете более старые версии Git, поскольку поддержка этого файла была добавлена ​​сравнительно недавно.

Который был добавлен совсем недавно. Это дамп из 2.15.0.

Работает для меня.

эхиллер
источник
Это самое простое, наименее навязчивое и надежное решение в Windows.
kwill
2
  1. Перейти в папку %PROGRAMFILES%\Git\etc
  2. Редактировать файл profile
  3. Добавить в первую строку HOME="c:\location_were_you_want_gitconfig"
  4. Готово

Примечание . Права доступа к файлам обычно ограничены, поэтому измените их соответствующим образом, иначе вы не сможете сохранить свои изменения.

Cuasijoe
источник
Это не работает с git 2.24, Win10, декабрь 2019 г. git config --list --show-originпоказывает, что исходный HOME все еще на месте.
Фрэнк
1

Для меня это сработало очень просто:

  1. Скопируйте ".gitconfig" из старого каталога: в% USERPROFILE% (по умолчанию в "c: \ users \ username")
  2. Щелкните правой кнопкой мыши значки запуска GITGUI и GITBASH и измените «запустить в»: «% HOMEDRIVE %% HOMEPATH%» на «% USERPROFILE%». Конечно, вы можете использовать любой другой каталог вместо "% USERPROFILE%".

снимок экрана до

снимок экрана после

Ральф Швердт
источник
0

Решение без изменения переменной Windows HOME
ОС: Windows 10
версия git: 2.27.0.windows.1

Я использую портативную версию Git, поэтому все мои файлы конфигурации находятся на моем фломастере (E :). Вот что сработало для меня:

  1. Загрузите переносимый Git с https://git-scm.com/ . Запустите файл и установите его в нужное место. Я установил его в E: \ git .
  2. Запустите git-bash.exe из E: \ git .
  3. Я хотел поместить .gitconfigи другие файлы bash в E , поэтому я создал папку с именем home, в которой я хочу их все.
    mkdir home
  4. Перейдите в папку etc и откройте файл с именем profile (в моем случае это E: \ git \ etc \ profile)
  5. Добавьте абсолютный путь к созданному нами домашнему каталогу (или к каталогу, в котором вы хотите разместить файл .gitconfig) в конце файла профиля .
    HOME="E:\git\home"

Теперь он больше не ищет .gitconfig в каталоге C: \ Users <username>, а ищет только указанный выше путь.

$ git config --global --list
fatal: unable to read config file 'E:/git/home/.gitconfig': No such file or directory

Это выдало ошибку, потому что там еще нет файла .gitconfig. Это просто, чтобы продемонстрировать, что мы успешно изменили расположение файла .gitconfig, не меняя каталог HOME в Windows.

Аллика
источник