在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个回答

0

我遇到了完全相同的问题。我的主目录映射到了网络驱动器。此外:

  1. 无法写入主目录
  2. 无法写入Git bash配置文件
  3. 没有管理员权限从控制面板更改环境变量。

但是以下命令行有效,我能够将HOME添加到环境变量中。

rundll32 sysdm.cpl,EditEnvironmentVariables


这只是一个控制台快捷方式,可访问环境变量编辑器。 - Raúl Salinas-Monteagudo

0

根据答案https://dev59.com/Puk6XIcBkEYKwwoYEf8H#32233667,我想补充一下,这可能会有用。

我们公司已经设置了GPO(组策略对象),因此无论我们做出什么更改,都会被组策略替换。例如,HOME文件夹(可能是基于DFS的网络共享)已经为所有用户配置为T:驱动器,因此在T:驱动器的根目录中创建文件是不允许的。当尝试克隆存储库或创建用户.gitconfg时,会出现错误。我在git/etc/profile文件中重新配置了HOME变量,如下所示:

HOME=/c/users/${USERNAME}

而且为了执行操作,比如克隆,我使用git bash,因为在Windows CMD中仍然是"HOME=T:/"。

-9

请看这里: 创建系统还原点。 以管理员账户登录。 删除文件夹 C:\SomeUser。 将文件夹 c:\Users\SomeUser 移动到 c:\SomeUser。 打开注册表编辑器。 导航到 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList。 搜索 "ProfileImagePath" 直到找到指向 c:\Users\SomeUser 的路径。 修改它,使其指向 c:\SomeUser。 如果出现问题,请使用系统还原。


4
这将移动他的Windows用户个人资料。我认为这不是他想要的。 - David Ferenczy Rogožan
1
很有可能,在公司的设置下,他可能没有这个权限。 - Menachem

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