J'ajoute fréquemment des scripts bash à mon référentiel git, et les scripts ont des autorisations exécutables dans le système de fichiers linux avant le git add
. Mais après avoir poussé les fichiers ajoutés vers un référentiel distant et avoir récupéré un autre emplacement, les fichiers s'affichent avec des autorisations non exécutables. Il semble y avoir deux façons de corriger le problème:
1. chmod u+x $script
git commit -am "fixing the script permissions... again..."
ou
2. git update-index --chmod=+x $script
Au lieu de corriger les permissions à chaque fois, y a-t-il un moyen pour que git regarde simplement les permissions du fichier sur le script pendant git add
, reconnaissez que "hé, voici un fichier exécutable!" et l'ajouter directement au référentiel avec les autorisations disponibles?
Il y a plusieurs façons de procéder.
alias Git
Vous pouvez toujours utiliser bash dans votre alias git.
Ouvrez votre configuration git:
vim ~/.gitconfig
Ajoutez-y une section d'alias (s'il n'en existe pas):
[alias]
addscr = !sh -c 'if [[ ${0: -3} == ".sh" ]]; then git update-index --chmod=+x $0; git add $0'
alias Bash
Modifiez votre fichier de profil bash:
vim ~/.bashrc
Ajoutez ceci à la fin du fichier:
function gitadd(){
if [[ ${1: -3} == ".sh" ]]
then git update-index --chmod=+x $1
fi
git add $1
}
alias gitadd='gitadd'
Combiner les alias git et bash
Modifiez votre fichier de profil bash:
vim ~/.bashrc
Ajoutez ceci à la fin du fichier:
function checkShellFile(){
return ${1: -3} == ".sh"
}
alias gitadd='checkShellFile ? git addsrcipt "$1" : && git add "$1"'
Modifiez votre fichier de configuration git:
vim ~/.gitconfig
Ajoutez-y une section d'alias (s'il n'en existe pas):
[alias]
addscript = !sh -c 'git update-index --chmod=+x $0 && git add $0'
Aucun des éléments ci-dessus n'a été testé
git 2.9.X/2.10 (Q3 2016) apporte chmod
à git add
lui-même!
Voir commit 4e55ed (31 mai 2016) par Edward Thomson (ethomson
) .
Aidé par: Johannes Schindelin (dscho
) .
(Fusionné par Junio C Hamano - gitster
- in commit c8b080a , 06 juillet 2016)
add
: ajoutez--chmod=+x
/--chmod=-x
optionsLe bit exécutable ne sera pas détecté (et ne sera donc pas défini) pour les chemins dans un référentiel avec
core.filemode
défini sur false, bien que les utilisateurs puissent toujours souhaiter ajouter des fichiers en tant qu'exécutables pour des raisons de compatibilité avec d'autres utilisateurs qui font ontcore.filemode
fonctionnalité.
Par exemple, les utilisateurs Windows qui ajoutent des scripts Shell peuvent souhaiter les ajouter en tant qu'exécutables pour assurer la compatibilité avec les utilisateurs non Windows.Bien que cela puisse être fait avec une commande de plomberie (
git update-index --add --chmod=+x foo
), enseigner legit-add
commande permet aux utilisateurs de définir un fichier exécutable avec une commande qu'ils connaissent déjà .
Vous pouvez voir l'origine de cette nouvelle fonctionnalité dans " Comment créer des autorisations de mode d'exécution de fichier dans Git sous Windows? " (février 2011)
Voici un script pour appliquer automatiquement "git update-index --chmod + x" aux fichiers exécutables:
for f in `find . -name '*.sh' -o -regex './s?bin/[^/]+' -o -regex './usr/sbin/[^/]+' -o -regex './usr/lib/[^/]+' `;do
( cd `dirname $f` && git update-index --chmod=+x `basename $f` )
done
ne solution sans script bash sophistiqué:
fileMode = true
dans votre .git/config
fichier (ou en exécutant git config core.filemode true
comme d'autres l'ont souligné)chmod u+x $script
comme vous l'avez souligné). Vous ne devez le faire qu'une seule fois.La prochaine fois que vous tirerez de là, git mettra le bit exécutable validé sur le fichier. J'ai également eu des problèmes similaires, cela les a résolus.
fileMode = true
dit à git de suivre la seule chose qu'il peut sur les permissions: le bit exécutable. Cela signifie que les modifications apportées au bit exécutable seront reconnues par git comme des modifications dans l'arborescence de travail et ces modifications seront stockées dans le dépôt avec votre prochain commit.
Une fois que vous avez validé le bit exécutable souhaité, vous pouvez également réinitialiser votre fileMode
à false
pour que la prochaine fois git ne vous dérange pas avec de telles modifications lorsque vous ne voulez pas les valider.
Je ne pense pas que cela puisse être fait sur le git add
, mais vous pourrez peut-être exécuter un script juste après avoir exécuté le git commit
, mais avant que la validation ne soit réellement créée.
Jetez un œil au crochet de pré-validation.
http://git-scm.com/book/en/Customizing-Git-Git-Hooks
Fondamentalement, créez simplement un fichier dans votre dossier .git/hooks/appelé pré-commit. (Il devrait y avoir des échantillons déjà dans votre dossier hooks, renommez-les pour supprimer le ".sample" à la fin pour en activer un.)
Theres un gotcha. Assurez-vous que votre script s'exécute git stash -q
d'abord pour que vous travailliez sur les versions intermédiaires réelles des fichiers.