web-dev-qa-db-fra.com

Changer l'emplacement du répertoire ~ dans une installation Windows de Git Bash

Je ne suis même pas sûr de poser la bonne question. Laissez-moi expliquer ma situation:

Il s’agit de Git sous Windows 7.

Mon entreprise configure le répertoire utilisateur Windows sur un lecteur réseau, et non sur le disque dur local (pour la sauvegarde et pour d’autres fins dépassant le cadre de cette question). Je ne peux pas changer cette politique.

Je peux avoir des fichiers locaux en dehors de ce schéma cependant et c'est comment mon serveur Apache est configuré. Entièrement local.

J'ai installé Git. Il installe Bash. Lorsque je lance Bash et cd ~ (changement dans le répertoire racine), je constate que cette dernière (la racine Bash) pointe vers mon répertoire utilisateur réseau. Je veux qu'il ne fasse pas ça. Je veux que ~ soit ailleurs sur mon disque dur. Je le souhaite afin que, lorsque j'effectue d'autres opérations, telles que l'installation d'un certificat, une clé SSH, etc., ses valeurs par défaut n'utilisent pas automatiquement ce répertoire réseau.

J'ai cherché en vain partout, et tout ce que je peux trouver fait référence à des réponses qui impliquent des alias, une redirection, et l'emplacement vers lequel pointe $ HOME. Mais ce n'est pas ce que je veux du tout.

La question est: Puis-je changer ce répertoire? Et si oui: comment?

MISE À JOUR: Donc, $ HOME est ce que je dois modifier. Cependant, n'ayant pas pu trouver où cette variable mythique $ HOME est définie, j'ai supposé qu'il s'agissait d'une version du système Linux de PATH ou quelque chose du genre. En tous cas...

J'ai un fichier "profil" sous git/etc. Voici le contenu (notez no $ 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
89
PEWColina

Je ne comprends pas pourquoi vous ne voulez pas définir la variable d'environnement $HOME car cela résout exactement ce que vous demandez.

cd ~ ne signifie pas modifier le répertoire racine, mais modifier le répertoire de base de l'utilisateur , défini par la variable d'environnement $HOME.

Je viens de le tester et cela fonctionne pour moi:

Ouvrez C:\Program Files (x86)\Git\etc\profile et définissez la variable $HOME sur ce que vous voulez (ajoutez-la si elle n’y est pas). Un bon endroit pourrait être par exemple juste après une condition commentée par # Set up USER's home directory. Mettez là quelque chose comme ceci:

HOME=/c/my/custom/home

Enregistrez-le, ouvrez git-bash et exécutez cd ~. Vous devriez être dans un répertoire /c/my/custom/home maintenant.

Tout ce qui accède au profil de l'utilisateur doit aller dans ce répertoire au lieu de votre profil Windows sur un lecteur réseau.

Remarque: C:\Program Files (x86)\Git\etc\profile est partagé par tous les utilisateurs. Par conséquent, si la machine est utilisée par plus d'utilisateurs, il est judicieux de définir le $HOME de manière dynamique:

HOME=/c/Users/$USERNAME
85
Dawid Ferenczy

Je vois que cette question a déjà reçu une réponse, mais je me trouve dans une situation similaire et je pensais partager ce que j'ai fait. Au départ, je l’ai fait, pas pour Git, mais pour MSYS/MinGW.

La variable d'environnement HOME n'étant normalement pas définie pour les applications Windows, sa création via Windows n'a aucune incidence sur les éléments non souhaités. Dans les propriétés de l'ordinateur (cliquez avec le bouton droit sur Ordinateur - ou le nom de celui-ci - dans l'Explorateur, puis sélectionnez Propriétés ou Panneau de configuration -> Système et sécurité -> Système), choisissez Advanced system settings, puis Evironment Variables... et créez-en un nouveau, HOME, et attribuez-le où vous voulez.

Si vous ne pouvez pas créer de nouvelles variables d'environnement, l'autre réponse fonctionnera toujours. (J'ai expliqué en détail comment créer des variables d'environnement, car il est si difficile à trouver.)

26
Menachem

Dans mon cas, tout ce que je devais faire était d’ajouter la variable utilisateur suivante sous Windows:

Nom de la variable: HOME
Valeur de la variable: %USERPROFILE%

Comment définir une variable d'environnement (Vous pouvez utiliser les variables User pour la section nom_utilisateur si vous n'êtes pas administrateur système)

21
EliandroRibeiro

Au lieu de modifier la variable profile globale, vous pouvez créer le .bash_profile dans votre répertoire $HOME par défaut (par exemple C:\Users\WhateverUser\.bash_profile) avec le contenu suivant:

export HOME="C:\my\projects\dir"
cd "$HOME" # if you'd like it to be the starting dir of the git Shell
16
dekkard

1.Clic droit sur le raccourci Gitbash, choisissez Propriétés.
2.Choisissez l'onglet "Raccourci"
3. Tapez votre répertoire de départ dans le champ "Démarrer dans"
4.Retirer la partie "--cd-to-home" du champ "Target"

5
Özgür Öztürk

Donc, $ HOME est ce que je dois modifier. Cependant, n'ayant pas pu trouver où cette variable mythique $ HOME est définie, j'ai supposé qu'il s'agissait d'une version du système Linux de PATH ou quelque chose du genre. En tous cas ...**

Réponse

L'ajout de HOME en haut du fichier profile a fonctionné.

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
3
Duncan Jones

J'ai fait face exactement au même problème. Mon lecteur local mappé sur un lecteur réseau. Également 1. Aucun accès en écriture au lecteur à domicile 3. Pas d’accès en écriture au profil Git bash 4. Aucun droit d'administrateur pour modifier les variables d'environnement à partir du panneau de configuration. 

Cependant, ci-dessous a fonctionné à partir de la ligne de commande et j'ai pu ajouter HOME aux variables d'environnement.

rundll32 sysdm.cpl,EdtEnvironmentVariables

0
garg10may

Donc, $HOME est ce que je dois modifier.

Cependant, je suis incapable de trouver où cette variable mythique $HOME est définie. J'ai donc supposé qu'il s'agissait d'une version du système Linux de PATH ou de quelque chose du genre.

Git 2.23 (Q3 2019) est assez explicite sur la définition de HOME.

Voir commit e12a955 (04 juil. 2019) par Karsten Blees (kblees) .
(Fusionné par Junio ​​C Hamano - gitster - dans commit fc613d2 , 19 juillet 2019)

mingw: initialise HOME au démarrage

L'initialisation de HOME était historiquement dupliquée à différents endroits, notamment /etc/profile, des scripts de lancement tels que git-bash.vbs et gitk.cmd, et (bien que légèrement cassé) dans le git-wrapper .

Même des projets indépendants, tels que GitExtensions et TortoiseGit doivent implémenter la même logique pour pouvoir appeler directement git.

Initialisez HOME dans le code de démarrage de Git afin que nous puissions éventuellement supprimer tout le code d'initialisation en double.

Maintenant, mingw.c inclut le code suivant:

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