在 Windows 上更改 .gitconfig 位置

Posted

技术标签:

【中文标题】在 Windows 上更改 .gitconfig 位置【英文标题】:Changing .gitconfig location on Windows 【发布时间】:2011-05-02 08:13:43 【问题描述】:

默认情况下,Windows Git 将全局 .gitconfig 放置在 c:\documents and settings\user\

如何更改该位置,以便将 .gitconfig 存储在 c:\my_configuration_files\ 中?

能做到吗?

【问题讨论】:

只是想补充一下,我也遇到了这个问题。我在 %userprofile%/.git/.gitignore 中有我所有其他全局 git 配置文件(“exludesfiles”和“attrirutesfile”)(所以在一个文件夹中),但是 .gitconfig 我希望它就在它们旁边, 但必须在 %userprofile% 的根目录下.. 真的很烦人。 自提出问题以来有什么进展吗?我的 .gitconfig 默认位于网络驱动器上,这意味着当我离线时它无法读取它。 这背后的真正问题是:你为什么要这样做? 【参考方案1】:

如果你将HOME 设置为c:\my_configuration_files\,那么 git 会在那里找到 .gitconfig。 here 描述了编辑环境变量。您需要设置 HOME 变量,然后重新打开任何 cmd.exe 窗口。使用“set”命令验证 HOME 确实指向正确的值。

当然,更改 HOME 也会影响其他应用程序。但是,从阅读 git 的源代码来看,这似乎是无需调整命令行即可更改这些文件位置的唯一方法。您还应该考虑 Stefan 的回应:您可以设置 GIT_CONFIG 变量。但是,为了达到您想要的效果,您需要将 --global 标志传递给所有 git 调用(以及任何本地 .git/config 文件都被忽略)。

【讨论】:

嗯,不确定我是否理解正确但不会更改 HOME 对使用它的所有其他应用程序也有影响?有没有办法改变HOME,但Git本地? 是的,它也会对其他应用程序产生影响。你问如何改变位置,我告诉你。查看我的编辑。 有没有人真的让它工作而不会因为搬家而弄乱一大堆其他事情? 这很可能是适用于 Windows 平台的解决方案。它也对我有用。我使用 Chocolatey 的 refreshenv 脚本来刷新我设置的环境变量 HOME(用户环境变量)。之后,我得到了所需的文件位置。 我必须重新安装 Git 才能正常工作。如果我只是添加了一个名为 HOME 的新环境变量并将 .gitconfig 文件移动到该目录,它就不起作用了。【参考方案2】:

更改 HOME 目录是错误的。更好的是为 gitconfig 创建到 HOME 目录的符号链接。

    将 .gitconfig 从用户主目录移动到所需的目录。 以管理员身份运行命令行 转到您的用户主目录 输入 mklink .gitconfig \PathForNewLocationOfConfig.gitconfig

【讨论】:

可能值得补充的是,如果您运行 git config --global 将一个项目添加到您的配置中,您的符号链接将被正在使用的 .gitconfig 的实际副本覆盖。我在测试 \PathForNewLocationOfConfig.gitconfig 是我的 Dropbox 文件夹的位置时遇到了这个问题 如果您的 .gitconfig 位于网络驱动器上,您可能会收到“设备不支持符号链接”消息,排除此选项。 我不认为这个解决方案适用于任何人。在我们公司,$HOME在网络驱动器上,每当网络连接出现问题时,链接也无法访问。 @MotoWilliams 在 2017 年重新审视这一点:使用 --global 编辑后符号链接保持不变 这里,组警 (AD) 设置 HOMEDRIVE、HOMEPATH 和 HOMESHARE,但不是普通的、旧的、简单的 HOME。在没有 HOME 的情况下,git 似乎使用了前三种的某种组合。但是设置 HOME(通过设置用户特定环境变量的常用方法)有效:GIT 使用您设置的 HOME 值,并且 grouppolicy 不会破坏 HOME。【参考方案3】:

我使用一种与其他配置文件略有不同的方法解决了这个问题。 Git Config 支持 includes,允许您指向另一个位置的配置文件。然后将该备用位置导入并扩展到位,就好像它是 .gitconfig 文件的一部分一样。所以现在我在 .gitconfig 中只有一个条目:

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

Git 写入 .gitconfig 文件的任何更新都不会覆盖我的包含路径。这确实意味着有时我可能需要将值从 .gitconfig 移动到 my.config。

【讨论】:

+1:没有奇怪的配置,我的全局 gitconfig 是我存储在 git repo 本身中的东西,所以跟踪里面的内容是我的工作。进行全局更改时,我只需手动编辑全局文件。所以这对我来说非常有效,不需要像改变你的“HOME”环境变量那样奇怪,这是一个奇怪的想法,只是为了把 Git 的配置放在你想要的地方。毕竟,主目录对许多其他程序具有其他含义。您还可以在顶部放置不同的身份,并使用此解决方案在各个身份之间保持密钥设置相同。太棒了! 我想知道是否可以让 git config 写入 [include]d 文件中的文件。 @JonathanNazario git config --file "included.file" 创建一个 bash 别名似乎效果很好:alias git="git -c include.path $PATH_TO_GITCONFIG" 然后,您根本不需要任何 $HOME/.gitconfig【参考方案4】:

查看git help configFILESENVIRONMENT部分。

【讨论】:

【参考方案5】:

我不是 Git 大师,但搜索对我来说最简单的解决方案是转到 C:\Program Files (x86)\Git\etc 并在文本编辑器中打开 profile

在第 37 行 # Set up USER's home directory 上有一条 if 语句。我取出 if 语句并放入我希望 gitconfig 所在的本地目录,然后我只是将现有的 gitconfig 文件(位于网络驱动器上)复制到该位置。

【讨论】:

非常感谢。虽然所有其他选项对我来说都失败了,但这只是为我节省了一百万个 git 语句乘以 6 秒:D 这就是我所做的......` HOME="$USERPROFILE\Downloads\Tools\Git_Config"` 在 git 2.24(2019 年 12 月)中不再存在“家”这个词(或任何与您相似的内容:37 行)。【参考方案6】:

对我来说,更改 Start In 位置(至少是 git-gui 的)并不会影响它查找 .gitconfig 的位置。我在工作中的设置为我们的家安装了 U:,但我们没有权限直接在 U: 中写入,只有在内部为我们创建的子目录,所以这对我来说是一个交易破坏者。

我通过制作一个批处理脚本解决了这个问题,该脚本将覆盖该应用程序的 HOMEDRIVE 和 HOMEPATH 环境变量。然后将我的开始菜单快捷方式更改为指向该批处理脚本。

【讨论】:

我想了解更多关于您为完成此修复所做的工作。 你能分享你的解决方案吗?【参考方案7】:

首先检查 HOME 设置,然后将 HOME 和 HOMEDRIVE 更改为现有目录。

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

然后将 HOME 和 HOMEDRIVE 更改为

set HOME=c:\tmp
set HOMEDRIVE=C:

【讨论】:

【参考方案8】:
    更改为文件夹%PROGRAMFILES%\Git\etc 编辑文件profile 添加到第一行HOME="c:\location_were_you_want_gitconfig" 完成

注意:文件权限通常受到限制,因此请相应地更改它们,否则您将无法保存更改。

【讨论】:

这在 2019 年 12 月的 git 2.24、Win10、git config --list --show-origin 显示,原来的 HOME 仍然存在。【参考方案9】:

如果您在 Windows 上并且由于权限不足而在更改环境变量或 mklink 时遇到问题,一个简单的解决方案是在另一个位置启动 git batch。

只需右键单击 Git Bash.exe,单击属性并将“Start in”属性更改为 c:\my_configuration_files\

【讨论】:

哇,这完全可以轻松工作。创建了一个新的快捷方式,并在“属性->开始于”下将 %HOMEDRIVE%%HOMEPATH% 更改为 `c:\my_repo_folder`。发挥了魅力。 这对我不起作用。 .gitconfig 文件仍然从我的主目录加载【参考方案10】:

我想做同样的事情。我能找到的最好的是@MicTech 的解决方案。但是,正如@MotoWilliams 所指出的,这在 Git 对 .gitconfig 文件所做的任何更新中都无法保留,该文件将链接替换为仅包含新设置的新文件。

我通过编写以下 PowerShell 脚本并在我的配置文件启动脚本中运行它解决了这个问题。每次运行时,它都会将已添加到用户 .gitconfig 的所有设置复制到全局设置,然后将 .gitconfig 文件中的所有文本替换为导入全局文件的 [include] 标头。

我将全局 .gitconfig 文件与许多其他全局脚本和工具一起保存在存储库中。我所要做的就是记住检查脚本附加到我的全局文件的任何更改。

这对我来说似乎很透明。希望对您有所帮助!

9 月 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

【讨论】:

【参考方案11】:

作为一个长期以来对此感兴趣的人。参见手册:

$XDG_CONFIG_HOME/git/config - 第二个用户特定的配置文件。如果$XDG_CONFIG_HOME 未设置或为空,将使用 $HOME/.config/git/config。此文件中设置的任何单值变量都将被 ~/.gitconfig 中的任何内容覆盖。如果您有时使用较旧版本的 Git,最好不要创建此文件,因为最近才添加了对该文件的支持。

这是最近才添加的。此转储来自 2.15.0。

为我工作。

【讨论】:

这是 Windows 中最简单、干扰最小、最可靠的解决方案。 对我不起作用。我在 $XDG_CONFIG_HOME/git/gitconfig 中有一个文件,但 git 没有看到它。 只是 - 它不是 $XDG_CONFIG_HOME/git/gitconfig ,而是 $XDG_CONFIG_HOME/git/config【参考方案12】:

对我来说它工作起来非常简单:

    将“.gitconfig”从旧目录复制到 %USERPROFILE%(“c:\users\username”中的标准) 右键单击 GITGUI 和 GITBASH 的启动图标,将“run in”:“%HOMEDRIVE%%HOMEPATH%”更改为“%USERPROFILE%”。当然,您可以使用任何其他目录来代替“%USERPROFILE%”。

screen shot before

screen shot after

【讨论】:

【参考方案13】:

无需更改 Windows HOME 变量的解决方案 操作系统:Windows 10 git版本:2.27.0.windows.1

我使用的是便携式版本的 Git,所以我所有的配置文件都在我的笔式驱动器(E:) 上。这对我有用:

    从https://git-scm.com/ 下载可移植的 Git。运行该文件并将其安装在所需位置。我将它安装在 E:\git 中。 从 E:\git 运行 git-bash.exe。 我想将.gitconfig 和其他 bash 文件放在 E 中,所以我创建了一个名为 home 的文件夹,我希望将它们全部放入其中。@987654323 @ 转到 etc 文件夹并打开名为 profile 的文件(在我的例子中,它是 E:\git\etc\profile) 在 profile 文件的末尾添加我们创建的 home 目录(或您希望放置 .gitconfig 文件的目录)的绝对路径。 HOME="E:\git\home"

现在它不再在 C:\Users 目录中搜索 .gitconfig,而只在上面设置的路径中查找。

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

它给出了一个错误,因为那里还没有 .gitconfig 文件。这只是为了证明我们已经成功地改变了.gitconfig文件的位置,而没有改变Windows中的HOME目录。

【讨论】:

【参考方案14】:

至少从 2.34.1 开始,您现在可以将 GIT_CONFIG_GLOBAL 环境变量设置为您的 .gitconfig 文件的路径。详情请见http://git-scm.com/docs/git-config#_environment。

【讨论】:

【参考方案15】:

1- 打开D:\PortableApps\Git-2.31.1PortableByAmir\etc\profile再见记事本

2- 将此添加到profile 文件:

HOME="/PortableHome"

3- 在D:\PortableApps\Git-2.31.1PortableByAmir\ 中创建PortableHome 文件夹

4-复制

C:\Users\Amir\.gitconfig
C:\Users\Amir\.git-credentials

D:\PortableApps\Git-2.31.1PortableByAmir\PortableHome

注意:D:\PortableApps\Git-2.31.1PortableByAmir\bin\bash.exe 不是可移植的 git 只开D:\PortableApps\Git-2.31.1PortableByAmir\git-bash.exe

【讨论】:

以上是关于在 Windows 上更改 .gitconfig 位置的主要内容,如果未能解决你的问题,请参考以下文章

在新的 Windows 10 机器上安装 Git 后缺少 .gitconfig 文件(此外,SourceTree 未启动 BeyondCompare)

禁用 git EOL 转换

Windows平台下将项目提交到Github上

Git

git代理,windows命令行代理,linux命令行代理

Git Setup