在 Git Bash 的 Windows 安装中更改 ~ 目录的位置

我甚至不确定我问的问题是否正确。让我解释一下我的情况:

这是关于 Windows 7上的 Git。

我的公司将 Windows 用户目录设置在网络驱动器上,而不是本地硬盘驱动器上(用于备份和超出本问题范围的其他用途)。我不能改变这个政策。

然而,我可以在这个方案之外拥有本地文件,这就是我的 Apache 服务器的设置方式。完全是本地的。

我安装了 Git。它安装了巴斯。当我启动 Bash 和 cd ~(更改为根目录)时,我发现它(Bash 根目录)指向我的网络用户目录。我不想让它那么做。我希望 ~在我硬盘上的其他地方。我希望这样,当我执行其他操作,如安装证书,SSH 密钥等,它的默认值将不会自动使用该网络目录。

我到处搜索都是徒劳的,我所能找到的都是涉及别名、重定向和 $HOME 指向的位置的答案。但那根本不是我想要的。

问题是: 我可以改变那个目录吗? 如果可以的话: 如何改变?

更新: 所以,$HOME 是我需要修改的。然而,我一直无法找到这个神秘的 $HOME 变量的设置位置,所以我假设它是一个 Linux 系统版本的 PATH 之类的。不管怎样...

我有一个“配置文件”下的 git/etc。这里的内容(注意没有 $HOME) :

  # To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any warranty.
# You should have received a copy of the CC0 Public Domain Dedication along
# with this software.
# If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.




# System-wide profile file


# Some resources...
# Customizing Your Shell: http://www.dsl.org/cookbook/cookbook_5.html#SEC69
# Consistent BackSpace and Delete Configuration:
#   http://www.ibb.net/~anne/keyboard.html
# The Linux Documentation Project: http://www.tldp.org/
# The Linux Cookbook: http://www.tldp.org/LDP/linuxcookbook/html/
# Greg's Wiki http://mywiki.wooledge.org/


# Setup some default paths. Note that this order will allow user installed
# software to override 'system' software.
# Modifying these default path settings can be done in different ways.
# To learn more about startup files, refer to your shell's man page.


MSYS2_PATH="/usr/local/bin:/usr/bin:/bin"
MANPATH="/usr/local/man:/usr/share/man:/usr/man:/share/man:${MANPATH}"
INFOPATH="/usr/local/info:/usr/share/info:/usr/info:/share/info:${INFOPATH}"
MINGW_MOUNT_POINT=
if [ -n "$MSYSTEM" ]
then
case "$MSYSTEM" in
MINGW32)
MINGW_MOUNT_POINT=/mingw32
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}:${PATH}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
MINGW64)
MINGW_MOUNT_POINT=/mingw64
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}:${PATH}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
MSYS)
PATH="${MSYS2_PATH}:/opt/bin:${PATH}"
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
;;
*)
PATH="${MSYS2_PATH}:${PATH}"
;;
esac
else
PATH="${MSYS2_PATH}:${PATH}"
fi


MAYBE_FIRST_START=false
SYSCONFDIR="${SYSCONFDIR:=/etc}"


# TMP and TEMP as defined in the Windows environment must be kept
# for windows apps, even if started from msys2. However, leaving
# them set to the default Windows temporary directory or unset
# can have unexpected consequences for msys2 apps, so we define
# our own to match GNU/Linux behaviour.
ORIGINAL_TMP=$TMP
ORIGINAL_TEMP=$TEMP
#unset TMP TEMP
#tmp=$(cygpath -w "$ORIGINAL_TMP" 2> /dev/null)
#temp=$(cygpath -w "$ORIGINAL_TEMP" 2> /dev/null)
#TMP="/tmp"
#TEMP="/tmp"
case "$TMP" in *\\*) TMP="$(cygpath -m "$TMP")";; esac
case "$TEMP" in *\\*) TEMP="$(cygpath -m "$TEMP")";; esac
test -d "$TMPDIR" || test ! -d "$TMP" || {
TMPDIR="$TMP"
export TMPDIR
}




# Define default printer
p='/proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Windows/Device'
if [ -e "${p}" ] ; then
read -r PRINTER < "${p}"
PRINTER=${PRINTER%%,*}
fi
unset p


print_flags ()
{
(( $1 & 0x0002 )) && echo -n "binary" || echo -n "text"
(( $1 & 0x0010 )) && echo -n ",exec"
(( $1 & 0x0040 )) && echo -n ",cygexec"
(( $1 & 0x0100 )) && echo -n ",notexec"
}


# Shell dependent settings
profile_d ()
{
local file=
for file in $(export LC_COLLATE=C; echo /etc/profile.d/*.$1); do
[ -e "${file}" ] && . "${file}"
done


if [ -n ${MINGW_MOUNT_POINT} ]; then
for file in $(export LC_COLLATE=C; echo ${MINGW_MOUNT_POINT}/etc/profile.d/*.$1); do
[ -e "${file}" ] && . "${file}"
done
fi
}


for postinst in $(export LC_COLLATE=C; echo /etc/post-install/*.post); do
[ -e "${postinst}" ] && . "${postinst}"
done


if [ ! "x${BASH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
[ -f "/etc/bash.bashrc" ] && . "/etc/bash.bashrc"
elif [ ! "x${KSH_VERSION}" = "x" ]; then
typeset -l HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
PS1=$(print '\033]0;${PWD}\n\033[32m${USER}@${HOSTNAME} \033[33m${PWD/${HOME}/~}\033[0m\n$ ')
elif [ ! "x${ZSH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
profile_d zsh
PS1='(%n@%m)[%h] %~ %% '
elif [ ! "x${POSH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
PS1="$ "
else
HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
PS1="$ "
fi


if [ -n "$ACLOCAL_PATH" ]
then
export ACLOCAL_PATH
fi


export PATH MANPATH INFOPATH PKG_CONFIG_PATH USER TMP TEMP PRINTER HOSTNAME PS1 SHELL tmp temp
test -n "$TERM" || export TERM=xterm-256color


if [ "$MAYBE_FIRST_START" = "true" ]; then
sh /usr/bin/regen-info.sh


if [ -f "/usr/bin/update-ca-trust" ]
then
sh /usr/bin/update-ca-trust
fi


clear
echo
echo
echo "###################################################################"
echo "#                                                                 #"
echo "#                                                                 #"
echo "#                   C   A   U   T   I   O   N                     #"
echo "#                                                                 #"
echo "#                  This is first start of MSYS2.                  #"
echo "#       You MUST restart shell to apply necessary actions.        #"
echo "#                                                                 #"
echo "#                                                                 #"
echo "###################################################################"
echo
echo
fi
unset MAYBE_FIRST_START
184473 次浏览

给你: 给你: 创建系统还原点。 用管理帐户登录。 删除文件夹 C: Some User。 移动文件夹 c: Users Some User,使其成为 c: Some User。 打开注册表编辑器。 导航到 HKLM 软件 Microsoft Windows NT CurrentVersion ProfileList。 搜索“ ProfileImagePath”,直到找到指向 c 的那个 ProfileImagePath: Users Some User。 修改它,使其指向 c: Some User。 使用系统还原以防出错。

我不明白你为什么不想设置 ABc0环境变量因为这正好解决了你的要求。

cd ~不是指 切换到根目录,而是由 $HOME环境变量设定的 更改到用户的主目录

快速肮脏的解决方案

编辑 C:\Program Files (x86)\Git\etc\profile并将 $HOME变量设置为您想要的任何值(如果没有则添加它)。例如,一个好的位置可以是在 # Set up USER's home directory注释了一个条件之后。它必须采用 MinGW 格式,例如:

HOME=/c/my/custom/home

保存它,打开 Git Bash 并执行 cd ~

访问用户配置文件的所有内容都应该进入这个目录,而不是进入网络驱动器上的 Windows 配置文件。

注意: C:\Program Files (x86)\Git\etc\profile是所有用户共享的,所以如果机器被多个用户使用,动态设置 $HOME是一个好主意:

HOME=/c/Users/$USERNAME

更干净的解决方案

在 Windows 中将环境变量 HOME设置为任意目录。在这种情况下,你必须设置它在 Windows 路径格式(与反斜杠,例如 c:\my\custom\home) ,Git Bash 将加载它,并将其转换为它的格式。

如果您想要 更改计算机上所有用户的主目录,将其设置为 系统环境变量,您可以使用例如 %USERNAME%变量,以便每个用户都有自己的主目录,例如:

HOME=c:\custom\home\%USERNAME%

如果您想要 只为你自己改变主目录,将其设置为 用户环境变量,这样其他用户就不会受到影响。在这种情况下,您可以简单地对整个路径进行硬编码:

HOME=c:\my\custom\home

我会分享我所做的,这不仅适用于 Git,也适用于 MSYS/MinGW。

HOME环境变量通常不是为 Windows 应用程序设置的,所以通过 Windows 创建它不会影响其他任何东西。在“计算机属性”中(右键单击“计算机-或其他名称-在资源管理器中,选择“属性”或“控制面板-> 系统和安全-> 系统”) ,选择 Advanced system settings,然后选择 Environment Variables...,创建一个新的 HOME,并将其分配到任何你喜欢的地方。

如果不能创建新的环境变量,那么另一个答案仍然有效。(我详细介绍了如何精确地创建环境变量,因为这很难找到。)

不需要修改全局 profile,您可以在默认的 $HOME目录(例如 C:\Users\WhateverUser\.bash_profile)中创建 .bash_profile,其内容如下:

export HOME="C:\my\projects\dir"
# or export HOME="/c/my/projects/dir"
cd "$HOME" # if you'd like it to be the starting dir of the git shell

1. 右击 Gitbash 快捷方式选择“属性”
2. 选择“快捷方式”标签
3. 在“开始”字段中键入起始目录
4. 从“目标”字段中删除“—— cd-to-home”部分

在我的例子中,我所要做的就是在 Windows 上添加以下 用户变量:

变量名: HOME
变量值: %USERPROFILE%

如何设定环境变量 (如果你不是系统管理员,可以使用 用户名的用户变量部分)

因此,$HOME 是我需要修改的。然而,我一直无法找到这个神秘的 $HOME 变量的设置位置,所以我假设它是一个 Linux 系统版本的 PATH 之类的。不管怎样..

回答我

profile文件的顶部添加 HOME 起作用了。

HOME="c://path/to/custom/root/".

  #THE FIX WAS ADDING THE FOLLOWING LINE TO THE TOP OF THE PROFILE FILE


HOME="c://path/to/custom/root/"


# below are the original contents ===========
# To the extent possible under law, ..blah blah


# Some resources...
# Customizing Your Shell: http://www.dsl.org/cookbook/cookbook_5.html#SEC69
# Consistent BackSpace and Delete Configuration:
#   http://www.ibb.net/~anne/keyboard.html
# The Linux Documentation Project: http://www.tldp.org/
# The Linux Cookbook: http://www.tldp.org/LDP/linuxcookbook/html/
# Greg's Wiki http://mywiki.wooledge.org/


# Setup some default paths. Note that this order will allow user installed
# software to override 'system' software.
# Modifying these default path settings can be done in different ways.
# To learn more about startup files, refer to your shell's man page.


MSYS2_PATH="/usr/local/bin:/usr/bin:/bin"
MANPATH="/usr/local/man:/usr/share/man:/usr/man:/share/man:${MANPATH}"
INFOPATH="/usr/local/info:/usr/share/info:/usr/info:/share/info:${INFOPATH}"
MINGW_MOUNT_POINT=
if [ -n "$MSYSTEM" ]
then
case "$MSYSTEM" in
MINGW32)
MINGW_MOUNT_POINT=/mingw32
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}:${PATH}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
MINGW64)
MINGW_MOUNT_POINT=/mingw64
PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}:${PATH}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
ACLOCAL_PATH="${MINGW_MOUNT_POINT}/share/aclocal:/usr/share/aclocal"
MANPATH="${MINGW_MOUNT_POINT}/share/man:${MANPATH}"
;;
MSYS)
PATH="${MSYS2_PATH}:/opt/bin:${PATH}"
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig:/lib/pkgconfig"
;;
*)
PATH="${MSYS2_PATH}:${PATH}"
;;
esac
else
PATH="${MSYS2_PATH}:${PATH}"
fi


MAYBE_FIRST_START=false
SYSCONFDIR="${SYSCONFDIR:=/etc}"


# TMP and TEMP as defined in the Windows environment must be kept
# for windows apps, even if started from msys2. However, leaving
# them set to the default Windows temporary directory or unset
# can have unexpected consequences for msys2 apps, so we define
# our own to match GNU/Linux behaviour.
ORIGINAL_TMP=$TMP
ORIGINAL_TEMP=$TEMP
#unset TMP TEMP
#tmp=$(cygpath -w "$ORIGINAL_TMP" 2> /dev/null)
#temp=$(cygpath -w "$ORIGINAL_TEMP" 2> /dev/null)
#TMP="/tmp"
#TEMP="/tmp"
case "$TMP" in *\\*) TMP="$(cygpath -m "$TMP")";; esac
case "$TEMP" in *\\*) TEMP="$(cygpath -m "$TEMP")";; esac
test -d "$TMPDIR" || test ! -d "$TMP" || {
TMPDIR="$TMP"
export TMPDIR
}




# Define default printer
p='/proc/registry/HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/Windows/Device'
if [ -e "${p}" ] ; then
read -r PRINTER < "${p}"
PRINTER=${PRINTER%%,*}
fi
unset p


print_flags ()
{
(( $1 & 0x0002 )) && echo -n "binary" || echo -n "text"
(( $1 & 0x0010 )) && echo -n ",exec"
(( $1 & 0x0040 )) && echo -n ",cygexec"
(( $1 & 0x0100 )) && echo -n ",notexec"
}


# Shell dependent settings
profile_d ()
{
local file=
for file in $(export LC_COLLATE=C; echo /etc/profile.d/*.$1); do
[ -e "${file}" ] && . "${file}"
done


if [ -n ${MINGW_MOUNT_POINT} ]; then
for file in $(export LC_COLLATE=C; echo ${MINGW_MOUNT_POINT}/etc/profile.d/*.$1); do
[ -e "${file}" ] && . "${file}"
done
fi
}


for postinst in $(export LC_COLLATE=C; echo /etc/post-install/*.post); do
[ -e "${postinst}" ] && . "${postinst}"
done


if [ ! "x${BASH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
[ -f "/etc/bash.bashrc" ] && . "/etc/bash.bashrc"
elif [ ! "x${KSH_VERSION}" = "x" ]; then
typeset -l HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
PS1=$(print '\033]0;${PWD}\n\033[32m${USER}@${HOSTNAME} \033[33m${PWD/${HOME}/~}\033[0m\n$ ')
elif [ ! "x${ZSH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
profile_d zsh
PS1='(%n@%m)[%h] %~ %% '
elif [ ! "x${POSH_VERSION}" = "x" ]; then
HOSTNAME="$(/usr/bin/hostname)"
PS1="$ "
else
HOSTNAME="$(/usr/bin/hostname)"
profile_d sh
PS1="$ "
fi


if [ -n "$ACLOCAL_PATH" ]
then
export ACLOCAL_PATH
fi


export PATH MANPATH INFOPATH PKG_CONFIG_PATH USER TMP TEMP PRINTER HOSTNAME PS1 SHELL tmp temp
test -n "$TERM" || export TERM=xterm-256color


if [ "$MAYBE_FIRST_START" = "true" ]; then
sh /usr/bin/regen-info.sh


if [ -f "/usr/bin/update-ca-trust" ]
then
sh /usr/bin/update-ca-trust
fi


clear
echo
echo
echo "###################################################################"
echo "#                                                                 #"
echo "#                                                                 #"
echo "#                   C   A   U   T   I   O   N                     #"
echo "#                                                                 #"
echo "#                  This is first start of MSYS2.                  #"
echo "#       You MUST restart shell to apply necessary actions.        #"
echo "#                                                                 #"
echo "#                                                                 #"
echo "###################################################################"
echo
echo
fi
unset MAYBE_FIRST_START

我也面临同样的问题,我的家庭驱动器映射到了网络驱动器

  1. 对主驱动器没有写访问权限
  2. 无法对 Git bash 配置文件进行写访问
  3. 没有从控制面板更改环境变量的管理权限。

然而下面的工作从命令行,我能够添加 HOME到环境变量。

rundll32 sysdm.cpl,EditEnvironmentVariables

我知道这是一个老问题,但它是“ gitbash home-dir 窗口”的最高谷歌搜索结果,所以我想我应该加上我的发现。

无论我尝试什么,我不能让 git-bash 启动在任何地方,但我的网络驱动器,(U:)在我的情况下,使每个操作需要15-20秒的响应。(远程员工使用 VPN,网络驱动器托管在国家的另一端)

我尝试在窗口中设置 HOME 和 HOMEDIR 变量。

我尝试在 git 安装的 setc/profile 文件中设置 HOME 和 HOMEDIR 变量。

我尝试将 git-bash 快捷方式中的“ Start in”编辑为 C:/user/myusername。

Git-bash shell 中的“ env”命令将显示正确的 c:/user/myusername:

对我来说,最终修复它的方法是编辑 git-bash 快捷方式,并从 Target 行中删除“—— cd-to-home”。

我在 Windows 10上运行最新版本的 Git for-Windows 2.22.0。

因此,$HOME是我需要修改的。

然而,我一直无法找到这个神秘的 $HOME变量的设置位置,所以我假设它是一个 Linux 系统版本的 PATH 之类的东西。

Git 2.23(2019年第三季度)对于如何设置 HOME非常明确。

提交 e12a955(2019年7月4日) by Karsten Blees (kblees)
(由 朱尼奥 · C · 哈马诺 gitster于2019年7月19日在 提交 fc613d2合并)

在启动时初始化 HOME

HOME的初始化历史上在许多不同的地方被复制, 包括 /etc/profile,启动脚本如 git-bash.vbsgitk.cmd, 和(虽然略有破碎)在 git-wrapper

即使像 GitExtensionsTortoiseGit这样不相关的项目也需要 实现相同的逻辑以便能够直接调用 git。

在 Git 自己的启动代码中初始化 HOME,这样我们最终就可以退休了 所有重复的初始化代码。

现在,明天见包含以下代码:

/* calculate HOME if not set */
if (!getenv("HOME")) {
/*
* try $HOMEDRIVE$HOMEPATH - the home share may be a network
* location, thus also check if the path exists (i.e. is not
* disconnected)
*/
if ((tmp = getenv("HOMEDRIVE"))) {
struct strbuf buf = STRBUF_INIT;
strbuf_addstr(&buf, tmp);
if ((tmp = getenv("HOMEPATH"))) {
strbuf_addstr(&buf, tmp);
if (is_directory(buf.buf))
setenv("HOME", buf.buf, 1);
else
tmp = NULL; /* use $USERPROFILE */
}
strbuf_release(&buf);
}
/* use $USERPROFILE if the home share is not available */
if (!tmp && (tmp = getenv("USERPROFILE")))
setenv("HOME", tmp, 1);
}