Fonction Bash / zsh qui va à la racine de git tree

Nov 26 2020

Je voudrais avoir un examen de la fonction qui se connecte à la racine de l'arbre git ou ne fait rien si nous sommes en dehors du référentiel.

version révisée:

# cd to the root of the current git directory
# If $PWD is submodule, will cd to the root of the top ancestor # It requires to stay in the current directory, if the root is . or unknown, # and use cd only once, to have a way to do `cd -` function cg { git_root() { local super_root local top top="$(git rev-parse --show-cdup)"
    top="${top:-./}" super_root="$(git rev-parse --show-superproject-working-tree)"
    if [[ "$super_root" ]]; then printf '%s' "$top../"
      ( cd "$top../" && git_root || return ) fi printf '%s' "$top"
  }
  local git_root
  git_root="$(git_root)" [ "x${git_root}" != "x./" ] && cd "$(git_root)" && return || return 0
}

Version mise à jour:

#!/bin/bash
# cd to the root of the current git directory
# If $PWD is submodule, will cd to the root of the top ancestor
# It requires to stay in the current directory, if the root is . or unknown,
# and use cd only once, to have a way to do `cd -`
function cg {
  function git_root {
    local top; top="$(git rev-parse --show-cdup)" top="${top:-./}"
    local super_root; super_root="$(git rev-parse --show-superproject-working-tree)" if [[ "$super_root" ]]; then
      printf '%s' "$top../" ( cd "$top../" && git_root || return )
    fi
    printf '%s' "$top" } local tree_root tree_root="$(git_root)"
  [[ "x${tree_root}" != "x./" ]] && cd "${tree_root}" && return || return 0
}

Réponses

4 chicks Nov 26 2020 at 10:12

Génial

  • 100% transmet le contrôle du shell, ce qui signifie que vous faites très bien de citer tout ce qui pourrait être potentiellement problématique.
  • variables de portée
  • en utilisant [[conditionnel pour leif
  • belle explication de ce qu'il fait et pourquoi

Pourrait être mieux

  • une ligne sh-bang en haut est une bonne idée pour les scripts, même si cela ne provient généralement que de vos scripts de connexion.
  • Votre fonction interne est définie avec une syntaxe différente de celle de votre fonction externe.
  • Vous pouvez étendre et définir une variable sur une seule ligne. Par exemple: local super_root="$(git rev-parse --show-superproject-working-tree)". Cela garantit que vous n'échouez pas à définir une variable locale ou à ne pas échouer dans la portée d'une nouvelle variable. Et il coupe une ligne de code dans chaque cas.
  • Réutiliser git_rootun nom de variable et le nom de la fonction est déroutant. Je me suis d'abord demandé pourquoi vous essayiez de définir la fonction après l'avoir définie.
  • utilisez [[conditionnel pour conditionnel dans la dernière ligne.