在 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 文件中的文件。 @JonathanNazariogit config --file "included.file"
创建一个 bash 别名似乎效果很好:alias git="git -c include.path $PATH_TO_GITCONFIG"
然后,您根本不需要任何 $HOME/.gitconfig
。【参考方案4】:
查看git help config
的FILES和ENVIRONMENT部分。
【讨论】:
【参考方案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
$ 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)