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

182

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

这是关于在Windows 7上使用Git的问题。

我的公司将Windows用户目录设置在网络驱动器上,而不是本地硬盘上(出于备份和其他超出此问题范围的目的)。我无法更改该策略。

但是,我可以在该计划之外拥有本地文件,这就是我的Apache服务器的设置方式。完全本地。

我安装了Git。它会安装Bash。当我启动Bash并执行cd ~(切换到根目录)时,我发现它(Bash根目录)指向我的网络用户目录。我不希望它这样做。我希望~在我的硬盘上的其他位置。我希望当我执行其他操作,例如安装证书、SSH密钥等时,它的默认设置不会自动使用该网络目录。

我到处搜索,但徒劳无功。所有我能找到的都涉及别名、重定向以及$HOME所指向的位置。但这根本不是我想要的。

问题是:我能改变那个目录吗?如果可以:如何操作?

更新:所以,我需要修改$HOME。然而,我一直找不到这个神秘的$HOME变量设置在哪里,所以我假设它是Linux系统版本的PATH或其他什么东西。无论如何...

我在git/etc下有一个"profile"文件。以下是其内容(请注意没有$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

~ 代表您的主目录。更改 HOME 环境变量将更改它所指向的位置。 - user2404501
请注意:HOME 环境变量不仅控制 ~ 的路径,还应该将所有访问用户主目录的内容都放在其中。 - David Ferenczy Rogožan
” 只是代表“用户主目录”的简写方式,所以无论 `` 指向哪里,都是用户的主目录。 - David Ferenczy Rogožan
是的,我找不到这个$HOME变量来设置它。上面我添加了我的配置文件长什么样子。 - PEWColina
只是提醒一下你的更新HOME不是Linux版本的PATH。Linux使用PATH与Windows非常相似。在Windows上,HOME等同于HOMEDRIVE+HOMEPATH,而在Linux上,你只需要一个变量(因为没有那些愚蠢的驱动器字母)。在两个系统中,HOME(或Windows等效)只是指向用户(配置文件)目录的指针,而PATH是可执行文件搜索的目录列表,当它被执行时(没有显式指定路径)。 - David Ferenczy Rogožan
显示剩余3条评论
13个回答

188

我不明白,为什么你不想设置$HOME环境变量,因为它恰好解决了你所要求的问题。

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 ~。现在你应该在目录/ c / my / custom / home中。

所有访问用户个人资料的内容都应该放在这个目录中,而不是放在位于网络驱动器上的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

4
谢谢,我在我的配置文件中找不到$HOME变量。我已将其添加到问题中,请查看。也许我需要在其他地方寻找该变量? - PEWColina
1
整个目录中没有其他文件调用/设置$HOME。 - PEWColina
11
еңЁй…ҚзҪ®ж–Ү件зҡ„йЎ¶йғЁж·»еҠ HOME="c://path/to/custom/root/"еҸҜд»ҘдҪҝе…¶з”ҹж•ҲгҖӮ - PEWColina
6
把“home”系统环境变量添加进去可以解决问题,而不是编辑 git 文件夹中的配置文件。 - firstpostcommenter
2
为所有用户设置类似于 HOME=c:\custom\home\%USERNAME% 的环境变量在我的 Windows 10 机器上不起作用,可能在任何机器上都不起作用。为什么?因为系统级别的 USERNAME 变量已经被设置为 SYSTEM,所以将使用它而不是当前登录的用户名。然而,在用户级别显式设置它似乎可以工作。实际上,这也解决了 Git 的另一个问题,即 Git for Windows 使用错误的环境变量来确定主目录,从而最终在某些网络驱动器上结束。 - beginner_
显示剩余10条评论

74

在我的情况下,我所需要做的就是在Windows上添加以下用户变量:

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

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


5
这对我来说完美地运作了,而且在我看来比被接受的答案更好。 - dan_g
2
这个答案应该放在顶部。 - user2165
1
这个方法可以用,但是在同一台机器上使用多个用户时会出问题。我只能通过将 HOME=/c/Users/$USERNAME 添加到配置文件中来解决。 - gonzo
4
这应该是最佳答案。这是唯一的方法(也是我找到的唯一方法),可以让GitBash使用我Windows用户文件夹(C:\ Users \ UserName)中的.ssh目录。在我的系统上,它默认为%HOMEDRIVE%(M:)。当然,即使更新后,它仍然有效! - YanisTheYak
1
如果您没有设置$HOME变量,那么这个方法是可行的,但是根据OP所说,他的$HOME变量是由公司政策设置的。我也遇到了同样的问题。在这种情况下,这个答案是不起作用的(新的设置会被公司政策自动覆盖)。 - bitsmack

43

我将分享我的做法,它不仅适用于Git,还适用于MSYS / MinGW。

HOME环境变量通常不会为Windows应用程序设置,因此通过Windows创建它不会影响其他任何内容。从计算机属性(在资源管理器中右键单击计算机 - 或命名为其他名称 - 并选择属性,或控制面板->系统和安全->系统),选择高级系统设置,然后选择环境变量...并创建一个新的HOME,并分配到您喜欢的任何位置。

如果您无法创建新的环境变量,则其他答案仍将起作用。 (我详细介绍了如何精确创建环境变量的详细信息,因为很难找到。)


5
如果您没有管理员权限来从控制面板更改环境变量,您需要在命令提示符中输入以下命令:rundll32 sysdm.cpl,EditEnvironmentVariables,或者在开始菜单中键入"environment"以启动相同的命令。请注意,这些命令将帮助您修改环境变量,而不需要管理员权限。 - Chris Chiasson
2
这对我来说很有效,用于设置git-bash的主目录。感谢您再次确认在Windows中设置HOME环境变量是可以的,并提供了详细的说明。只需进行一个简单的更改即可实现我的目标。 - Stephen Hosking
1
%USERPROFILE% 是将_HOME_环境变量设置为良好值的一个好选择。请参见我的答案 - EliandroRibeiro
@EliandroRibeiro 这是一种可能性,根据您的需求,也许是个好主意。对于我自己来说,我特别不希望以这种方式做。部分原因是为了保持Windows和类Unix环境的分离(避免混乱),另一部分原因是为了让我的HOME(~)更靠近根目录/树。 实际上,我创建了一个名为C:/home的目录并使用它。 此外,顺便提一下,OP指出他的%USERPROFILE%在网络驱动器上,像您描述的那样使用起来非常痛苦。 - Menachem
1
是的,Menachem,我很欣赏你的精确,但我想要实现的是简化过程细节,强调结果,这已经得到了许多人的确认,包括Stephen Hosking和我。对我来说,最终结果很重要,其他细节只是分散注意力的东西。希望你能理解。 - xpt
显示剩余5条评论

25

与其修改全局的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

是的!.bash_profile 是自定义您的环境的正确方法,黑客 .profile 不是好的做法。 - roblogic
1
@ropata "黑客" ~/.profile 是可以的。事实上,文档更喜欢它胜过 ~/.bash_profile:“适合仅影响特定用户(而不是整个系统)的环境变量的文件是.../.profile。”以及:“如.../.bash_profile...这样的shell配置文件通常被建议用于设置环境变量。虽然在Bash Shell中,这可能适用于从Shell启动的程序,但在桌面会话中从图形界面启动的程序默认情况下无法使用这些文件中设置的变量。” https://help.ubuntu.com/community/EnvironmentVariables - Hawkeye Parker

10

1.右键单击Gitbash快捷方式,选择属性
2.选择“快捷方式”选项卡
3.在“起始位置”字段中输入起始目录
4.从“目标”字段中删除“--cd-to-home”部分


5
并不真正改变 $HOME 变量。 - roblogic
1
哪个版本的Windows?在Windows 10中似乎无法进入“属性”。 - Peter Mortensen
@PeterMortensen 右键点击 Gitbash 快捷方式,选择属性。 - Özgür Öztürk
呃,这就是我需要的。谢谢。进入Git程序文件夹和.bash_profile/.bashrc没有任何效果。最终只需将“开始于”文件夹设置为我的主目录,一切都好了。这与我们公司的主目录分配有关,就像原帖作者所说的那样,有点疯狂。 - Nathan Beach
对我来说,@ÖzgürÖztürk和@dekkard的两个答案都起作用了。似乎删除--cd-to-home让git在Your_username中搜索.batch_profile - Cristian F.

5
所以,我需要修改的是$HOME。然而,我一直找不到这个神秘的$HOME变量在哪里设置,所以我认为它是类似于PATH的Linux系统版本。无论如何,在任何情况下...将HOME添加到profile文件的顶部即可解决问题。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

4
我知道这是一个旧问题,但它是“gitbash homedir windows”在谷歌上的首个搜索结果,所以我想添加我的发现。
无论我尝试什么,都不能让git-bash在除了我的网络驱动器(在我的情况下为U:)以外的任何地方启动,这使得每个操作都需要15-20秒才能响应。(远程员工连接VPN,在国家的另一端托管网络驱动器)
我尝试在Windows中设置HOME和HOMEDIR变量。
我尝试在git安装的etc/profile文件中设置HOME和HOMEDIR变量。
我尝试编辑git-bash快捷方式中的“开始位置”为C:/user/myusername。
git-bash shell内部的“env”命令将显示正确的c:/user/myusername。但是git-bash仍然会在U盘中启动。
最终解决我的方法是编辑git-bash快捷方式并从目标行中删除“--cd-to-home”。
我正在运行Windows 10,并使用最新版本的Git-for-windows 2.22.0。

1
嗨,grsiepka - 感谢您对SO的首次贡献。在阅读您的答案(我正在审核)时,突出的问题是它不仅仅是一个答案,而且是您尝试过但没有起作用的所有内容的描述 ;)。想象其他用户寻找答案并找到这个问题 - 然后他们期望/希望(被接受的)答案告诉他们如何解决自己的问题。一个好的答案是以此为前提编写的。您能编辑您的答案并使其更简短吗?谢谢。 - Carlo Wood
3
对我来说“被接受”的答案都没有用,我发表了我的解决方案。如果这没有帮助,请随意删除我的回答。 - grsiepka

4
所以,我需要修改的是$HOME。 然而,我一直没有找到设置这个神秘的$HOME变量的地方,所以我认为它是Linux系统版本的PATH或其他什么东西。 Git 2.23(2019年第三季度)非常明确地说明了如何设置HOME。 请参见commit e12a955(由Karsten Blees (kblees)于2019年7月4日提交)。 (由Junio C Hamano -- gitster --合并到commit fc613d2中,于2019年7月19日)

mingw: 在启动时初始化 HOME

HOME 的初始化在历史上被复制到许多不同的地方,包括 /etc/profile、启动脚本如 git-bash.vbsgitk.cmd,以及(虽然有些问题)在 git-wrapper 中。

即使是与编程无关的项目,例如 GitExtensionsTortoiseGit,也需要实现相同的逻辑才能直接调用 git。

在 Git 自己的启动代码中初始化 HOME,以便最终退役所有重复的初始化代码。

现在,mingw.c 包括以下代码:

/* 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);
}

1

快速摘要

将以下内容添加到你的C:\Users\my_username\AppData\Local\Programs\Git\etc\profile文件的最顶部:

HOME="/c/Users/$(whoami)"

这将使您的HOME~)目录设置为C:\Users\my_username。如果您使用的是网络或工作计算机,可能需要手动强制执行此操作,否则您的HOME目录可能指向网络驱动器,这可能会导致1)Git Bash运行非常慢,并且2)阻止正确加载您自定义的C:\Users\my_username\.bashrc文件。
来自@Paul Wintz在这里的回答:Git Bash (mintty) is extremely slow on Windows 10 OS

根据@Alexandre Jobin的评论,如果您的HOME变量指向共享网络文件夹,Git Bash可能会非常慢。

详细信息

我喜欢在Git Bash系统中将HOME~)目录设置为最低级别,即在profile文件中设置,Bash在打开时会导入或运行该文件,而不会干扰Windows环境变量或其他内容。

所以,这是我如何做到的:

在Git Bash中设置HOME目录

在文本编辑器(如Microsoft VSCode)中打开C:\Users\my_username\AppData\Local\Programs\Git\etc\profile文件。

将以下内容添加到文件的顶部

# CUSTOM CHANGE: change your home (`~`) dir to `C:\Users\my_username`.
# - Or, set it to whatever else you want here.
HOME="/c/Users/$(whoami)"
# OR (same thing)
# HOME="/c/Users/$USERNAME"

如果你想要一个不同的“HOME”目录,那么自然可以根据你的喜好进行自定义。
关闭并重新打开所有的Git Bash终端,以使更改生效。
在Git Bash中运行“echo "$HOME"”和“echo ~”来确认更改,现在应该显示你的新“HOME”目录。例如,我看到的是“/c/Users/gabriel”。
完成!
我是如何找到“C:\Users\my_username\AppData\Local\Programs\Git\etc\profile”文件的路径的?
我打开了Git Bash并运行了以下命令:
# navigate to what Git Bash has declared the "root" of this filesystem;
# since we are in Windows, I know this is a fake root
cd /

# Now, force Windows Explorer to open up in this directory so I can see 
# where it is!
explorer .

Voila!Windows Explorer在C:\Users\gabriel\AppData\Local\Programs\Git中打开了。现在,我从在Linux Ubuntu上的经验中知道,在Bash中加载的核心文件之一是位于/etc/profile的profile文件。所以,我在Windows Explorer中查找了那里,果然有一个etc/目录和一个其中的profile文件。于是,我尝试在那里设置HOME目录,结果成功了!
关于Git Bash和MSYS2中路径的更多细节
上面,我将你的HOME目录设置为C:\Users\my_username,它巧妙地使用whoami命令来获取你的用户名,这样每个人都可以使用相同的代码,而不管你的用户名是什么,因为它会自动填充给你。
请注意,Git Bash是基于MSYS2 MINGW64环境的,这是一个原生的Windows环境,它为您提供了类似Linux的工具和功能。因此,在上述文件中,您可以使用多种路径样式,包括以下几种。我个人测试过每一种都可以正常工作:
# Unix-style paths (my preference)
HOME="/c/Users/$(whoami)"

# Windows-style paths
# NOTE: You must escape the 2nd backslash in this case with another backslash 
# or else it mistakenly escapes the next character (`$`)
HOME="C:\Users\\$(whoami)"

# mixed paths (using both / and \), again escaping the backslash before 
# the $ sign
HOME="/c\Users\\$(whoami)"
# OR
HOME="C:/Users\\$(whoami)"
# OR
HOME="C:\Users/$(whoami)"

# funky weirdness paths with extra slashes
HOME="///C:\\Users\\///\\$(whoami)"

# etc.

注意,连续多个正斜杠(/)是可以的。但是,在Unix/Linux中,反斜杠(\)是转义字符,所以通常需要成对出现。因此,这个命令是不起作用的:HOME="C:////\\Users\\///\\\$(whoami)"。原因是末尾附近的\\\$部分是无效的。前面的两个反斜杠是可以的,因为第一个反斜杠转义了第二个反斜杠,但是\\$部分是一个转义的美元符号$,这破坏了命令替换$(whoami)。
我更喜欢使用Unix风格的路径,像这样:HOME="/c/Users/$(whoami)",在可能的情况下。
在Git Bash和MSYS2中,路径可能会非常令人困惑,因为MSYS2和Git Bash终端会自动将Unix风格的路径转换为Windows风格的路径。但是,有时候对于绝对路径的处理会有一些细微的差别。以我的问题为例,我花了很多天来调试:问题是:checking size of mp_limb_t... 0 and configure: error: Oops, mp_limb_t doesn't seem to work when compiling the Microchip XC32 compiler from source。我的答案是:解决方法:在Windows的MSYS2终端中编译时,不允许使用绝对的#include路径在C和C++中!。简而言之,我必须使用相对路径而不是绝对路径。
了解更多关于MSYS2和Windows与Unix路径工作原理的信息,请点击这里:
  1. https://www.msys2.org/docs/filesystem-paths/
  2. https://github.com/msys2/MINGW-packages/issues/6711#issuecomment-1797982823

另请参阅

以下是我完整的设置MSYS2的指示:从头开始安装和设置MSYS2,包括将所有7个配置文件添加到Windows终端。我在那里也会设置HOME目录。
在软件开发过程中,Git Bash终端最适合执行git命令。
在软件开发过程中,MSYS2终端最适合运行gccg++构建命令。因此,我建议分别安装这两个系统。请参考上面的链接获取更多详细信息。例如:从MSYS2 UCRT64(或类似)终端,您可以像这样运行gcc构建命令,来自我的eRCaGuy_hello_world存储库:https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/blob/master/c/hello_world_extra_basic.c#L24
gcc -Wall -Wextra -Werror -O3 -std=gnu17 hello_world_extra_basic.c -o bin/a -lm && bin/a

1

对于 Windows 10 上的 git bash,相同的操作是把 $HOME 设置为网络驱动器(响应速度慢)。我没有权限更改系统环境变量、Git 配置文件等。但我可以为我的用户添加 HOME 变量:

  • 在“开始”中搜索“环境变量”
  • 进入“编辑你的帐户的环境变量”(而不是“编辑系统环境变量”)
  • 在“环境变量”窗口里,“用户变量 for XYZXYZ” —> “新建”
  • 在“新建用户变量”里,设置:
    • “变量名:” 设置为“HOME”
    • “变量值:” 设置为“C:\Users\XYZXYZ”(或你需要的任何位置),然后点击“确定”
  • 重新启动(或关闭/打开)git bash,测试ls ~

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接