web-dev-qa-db-fra.com

Pourquoi un nom de branche ne peut-il pas contenir le caractère 'espace'?

J'ai essayé:

git branch "MyProj/bin/ ignored"

et reçu:

fatal: 'MyProj/bin/ ignored' is not a valid branch name.

La page git-branch man pointe sur la page/man git-check-ref-format pour obtenir les règles réelles d'un nom de branche valide.

Effectivement, la raison de l'erreur fatale ci-dessus semble être l'inclusion d'un caractère d'espacement.

Aucune idée pourquoi, de nos jours, les espaces sont toujours exclus du nom d'une branche (je l'aurais prévu dans l'ancien CVS, par exemple, mais Git?)

Quelles pourraient être des raisons techniques valables pour cela?

50
WinWin

Je ne sais pas si vous allez trouver une raison pure et technique au bas de la liste. Cependant, je peux affirmer que les espaces ont tendance à jeter des clés dans toutes sortes d’utilitaires * nix et de traitement de nom de fichier, de sorte qu’il a peut-être été évité de faire quelque chose de mal par la suite. Après tout, une branche git se résume à un fichier dans le référentiel, ce qui évite de traiter les espaces dans le nom de ce fichier (spécifiquement, une branche est un fichier dans .git/refs/heads /, comme mentionné dans le commentaire).

Surtout je suppose que la raison est philosophique et destinée à garder les choses simples. Les noms de branche sont des noms lisibles par l'homme qui n'ont aucune raison d'être compliquée (et qui nécessitent de taper deux caractères supplémentaires chaque fois, haha, pour invoquer le fantôme de l'administrateur système qui a associé chaque commande à une combinaison indéchiffrable de trois lettres). Autrement connu sous le nom d'argument "pourquoi le cd n'est pas chdir".

55
shelhamer

Il existe une solution de contournement possible si vous êtes suffisamment désespéré. Il y a beaucoup de caractères ressemblant à de l'espace dans le jeu Unicode. Mais seul U + 0020 est l’espace interdit. Prenons par exemple un espace insécable et vous pouvez avoir un nom de branche avec des espaces. Le problème principal est que votre clavier n'a probablement pas de clé pour ce point de code. J'utilise le script suivant pour résoudre ce problème:

#!/bin/zsh
git co -b "${@// / }"

Il remplace simplement tous les espaces dans les arguments par des espaces insécables ...

4
Vir

vieux fil, mais bon ..
sur un mac, j'utilise alt + space. ça va ajouter un personnage invisible qui fera l'affaire pour vous. esprit: ce n'est pas un "espace", c'est un personnage invisible. visuellement la même chose, mais effectivement pas la même chose. Il est probable que 100% vont confondre l’enfer avec qui que ce soit et qu’il va définitivement créer le chaos partout, mais bon, pour les plaisirs .. pourquoi pas? xD 

git checkout -b US24024 Automated Tests - Profile A Switched to a new branch 'US24024 Automated Tests - Profile A'

4
joe

Ce n'est pas autorisé car cela compliquerait la fonctionnalité de la commande "git checkout". 

Ex: Considérons que vous avez actuellement une branche appelée, bien que vous soyez actuellement dans le maître. Si vous voulez lancer la commande

(maître): git checkout -b mon correctif

git ne sait pas si vous voulez créer une nouvelle branche appelée "mon correctif" ou si vous voulez créer une nouvelle branche appelée "mon" liée à votre "correctif" original, plutôt que la branche "maître".

Source: https://git-scm.com/docs/git-checkout (Documentation Git)

1
Catalin Popescu

Parce que l’utilisation correcte des noms de chemins dans les scripts Shell est difficile. À partir de la page de manuel liée git check-ref-format elle-même:

Ces règles permettent aux outils basés sur les scripts Shell d’analyser référence noms, extension du chemin d'accès par le shell lorsqu'un nom de référence est utilisé sans citation (par erreur), et aussi éviter les ambiguïtés dans certains nom de référence expressions (voir gitrevisions (7)):

Voir aussi Noms de fichiers et chemins d'accès dans Shell: comment le faire correctement }:

Le problème de base est qu’aujourd’hui la plupart des utilisateurs de type Unix autorisent les noms de fichiers à inclure Presque tous les octets . Cela inclut les nouvelles lignes, les tabulations, le caractère d'échappement (y compris les séquences d'échappement pouvant exécuter des commandes lorsqu'elles sont affichées), autre caractères de contrôle, espaces (n'importe où!), tirets de tête (-), Shell métacaractères et les séquences d’octets qui ne sont pas des chaînes UTF-8 légales.

...

Cependant, cette faille dans les noyaux de type Unix (permettant des noms de fichiers dangereux) } _ combine avec des faiblesses supplémentaires dans le langage Bourne Shell, le rendant Encore plus difficile dans Shell pour gérer correctement les noms de fichiers et les chemins d'accès. JE pense que Shell est un langage raisonnable pour les scripts courts, lorsqu'il est correctement utilisé, mais la trop grande permissivité des noms de fichiers transforme les tâches faciles en tâches faciles à faire.

0
kelvin