45 votes

Marquer un fichier comme "non-commitable" avec Git

Je souhaite présenter certains de mes travaux en les téléchargeant sur mon compte GitHub. Cependant, certains fichiers contiennent des mots de passe, comme les connexions aux bases de données.

Existe-t-il un moyen de marquer un fichier comme non-commitable avec Git afin qu'il n'apparaisse pas sur GitHub ?

68voto

Giacomo1968 Points 48326

Existe-t-il un moyen de marquer un fichier comme non-commitable avec Git ? qu'il n'apparaisse pas sur GitHub ?

Tout d'abord, il n'y a aucun moyen d'avoir certains fichiers et commits visibles dans votre dépôt Git local mais en quelque sorte pas visibles dans GitHub ; si vous avez un fichier commis dans Git, il apparaîtra dans GitHub.

Deuxièmement, il n'existe aucun moyen simple et pratique de marquer un fichier individuel comme étant "non engageable". Mais il y a définitivement un moyen d'ignorer un fichier dans un repo Git : En ajoutant le(s) fichier(s) - y compris leur chemin relatif si nécessaire - à un fichier .gitignore fichier :

A .gitignore file spécifie les fichiers intentionnellement non suivis doit ignorer. Les fichiers déjà suivis par Git ne sont pas affectés ; voir la directive NOTES ci-dessous pour plus de détails.

Création d'une base .gitignore est assez simple puisqu'il s'agit d'un simple fichier texte. Ainsi, par exemple, si j'ai un fichier config.php dans votre racine, vous feriez cela ; en supposant que vous utilisez PHP, mais le concept s'applique à n'importe quelle configuration. J'utilise Nano comme éditeur de texte dans cet exemple, mais n'hésitez pas à utiliser l'éditeur de texte que vous utilisez habituellement :

nano .gitignore

Et ajoutez simplement ce nom de fichier à ce fichier :

config.php

Sauvegardez-le et maintenant Git ignorera simplement ce fichier.

Cela dit, ce que j'aime faire pour des configurations comme celle-ci, c'est de garder un échantillon/exemple de configuration sans spécificités sensibles dans le référentiel afin d'avoir une référence quant au format du fichier de configuration - un fichier nommé quelque chose comme ceci :

config.SAMPLE.php

De cette façon, vous savez exactement comment le config.php doit être configuré via config.SAMPLE.php et vous pouvez vous assurer que le config.php n'est jamais touché par Git.

En outre, si vous envisagez de montrer votre code, vous devez vous attendre à ce que quelqu'un essaie de prendre ce code et de le mettre en œuvre sur son propre système d'une manière ou d'une autre. Rappelez-vous, nous ne sommes pas vous et sans un exemple de fichier de configuration dans votre répertoire, les gens ne comprendront pas vraiment comment implémenter le code sur leur propre système. Ils pourraient même penser que vous n'êtes pas compétent parce que vous n'avez pas fourni un exemple de configuration de base.

33voto

Melise Points 1

Vous pouvez également ajouter un crochet pre-commit pour mettre en œuvre des contrôles d'intégrité. Le répertoire .git/hooks de chaque dépôt git contient des exemples de scripts.

Le script appelé pre-commit est exécutée si elle existe avant chaque commit, et une valeur de retour non nulle annule le commit.

Par exemple, vous pourriez avoir un simple script comme celui-ci :

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

Et si cela filename correspond, le commit échoue.

12voto

phk Points 315

Ce que @JakeGould a dit. Dans certains cas, vous pouvez également utiliser des bits de fichiers spéciaux comme skip-worktree o assume-unchanged qui peut être défini de la manière suivante ; pour les différences entre les deux, voir cette réponse de Stack Overflow :

git update-index --assume-unchanged <file>

Ce qui cachera alors les modifications supplémentaires apportées à un fichier déjà existant et que vous pouvez utiliser si vous voulez vraiment qu'un fichier soit présent après chaque extraction. Mais je vous conseille de ne l'utiliser que si vous savez vraiment ce que vous faites.

8voto

Dean Points 1688

を使用します。 .gitignore comme l'a dit @JakeGould. En outre, quelques informations connexes :

  • .gitignore empêche les fichiers d'être suivis ; s'ils le sont déjà, utilisez l'option git rm --cached pour les supprimer
  • fichiers/motifs dans $GIT_DIR/info/exclude sera également ignorée
  • dans le fichier spécifié par le fichier core.excludesFile dans la base de données de l'utilisateur. ~/.gitconfig sont également ignorées.

Siehe la documentation officielle de Git pour plus de détails.

2voto

Joe Points 274

Pour compléter les réponses de Jake et 46 : une très bonne pratique consiste à utiliser une extension cohérente pour les fichiers dans lesquels figurent des informations privées, et à utiliser .gitignore pour toujours exclure globalement les fichiers ayant cette extension (à l'aide de l'option .gitconfig comme indiqué ailleurs pour qu'il soit toujours ignoré par l'utilisateur).

De cette façon, vous pouvez avoir par exemple

/projectname/mypasswords.exc 

et si vous avez exclu *.exc globalement, vous savez alors qu'il ne sera pas livré, même si vous oubliez d'exclure individuellement ce fichier spécifique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X