web-dev-qa-db-fra.com

Marquer le fichier comme «non commitable» avec Git

Je veux montrer une partie de mon travail en les téléchargeant sur mon compte GitHub. Cependant, certains fichiers contiennent des mots de passe, tels que les connexions à la base de données.

Existe-t-il un moyen de marquer un fichier comme étant inutilisable avec Git afin qu'il ne puisse pas apparaître sur GitHub?

41
Adam Carter

Existe-t-il un moyen de marquer un fichier comme étant inutilisable avec Git afin qu'il ne puisse pas apparaître sur GitHub?

Premièrement, il n’existe aucun moyen d’afficher certains commits et commits dans votre référentiel Git local mais d’une manière ou d’une autre ne peut pas être visualisés dans GitHub; si vous avez un fichier validé 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 gommable". Mais il existe définitivement un moyen d’ignorer un fichier dans un dépôt Git: ajouter le (s) fichier (s) (y compris le chemin relatif, si nécessaire) à un fichier .gitignore :

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

Créer un .gitignore de base est assez facile car il ne s’agit que d’un fichier texte brut. Ainsi, par exemple, si j'avais un fichier config.php à la racine, vous le feriez; en supposant que vous utilisez PHP, mais le concept s'applique à n'importe quelle configuration. De plus, j'utilise Nano comme éditeur de texte dans cet exemple, mais n'hésitez pas à utiliser l'éditeur de texte que vous utilisez normalement pour cela:

nano .gitignore

Et ajoutez simplement ce nom de fichier à ce fichier:

config.php

Enregistrez-le et maintenant, Git ignorera simplement ce fichier.

Cela dit, ce que j'aime faire pour les configurations telles que celle-ci est de garder un exemple/exemple de configuration neutre des détails sensibles dans le référentiel afin que je sache ce que le format de fichier de configuration est un fichier nommé comme ceci:

config.SAMPLE.php

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

De plus, si vous envisagez de montrer votre code, vous devez vous attendre à ce que quelqu'un essaye de le prendre et de le mettre en œuvre sur son propre système. Rappelez-vous, nous ne sommes pas vous et sans un exemple de fichier de configuration dans votre référentiel, les gens ne comprendront pas vraiment comment implémenter le code eux-mêmes. Ils pourraient même penser que vous n’êtes pas compétents parce que vous n’avez pas fourni d’exemple de configuration de base.

67
JakeGould

Vous pouvez également ajouter un crochet de pré-validation pour mettre en œuvre les contrôles de cohérence. Le répertoire .git/hooks de chaque référentiel git contient des exemples de scripts.

Le script appelé pre-commit est exécuté s'il existe avant chaque validation, et une valeur de retour non nulle annule la validation.

Par exemple, vous pourriez avoir un script simple comme ceci:

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

Et si cette filename correspond, la validation échoue.

25
Juho Östman

Ce que @JakeGould a dit Dans certains cas, vous pouvez également utiliser des bits de fichier spéciaux tels que skip-worktree ou assume-unchanged qui peuvent être définis de la manière suivante; pour les différences entre les deux, voir cette réponse au débordement de pile :

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

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

12
phk

Utilisez un .gitignore comme @JakeGould. En outre, quelques informations connexes:

  • .gitignore empêche les fichiers d'être suivis; s'ils sont déjà suivis, utilisez git rm --cached pour les supprimer
  • les fichiers/modèles dans $GIT_DIR/info/exclude seront également ignorés
  • les fichiers/modèles du fichier spécifié par le fichier core.excludesFile dans le ~/.gitconfig de l'utilisateur sont également ignorés.

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

8
46and2

Pour étendre les réponses de Jake et 46: une très bonne pratique consiste à utiliser une extension cohérente pour les fichiers dans lesquels vous incluez des informations privées et à utiliser .gitignore pour toujours exclure les fichiers portant cette extension de manière globale (en utilisant le fichier .gitconfig comme indiqué ailleurs). toujours ignoré pour votre utilisateur).

De cette façon, vous pouvez avoir par exemple:

/projectname/mypasswords.exc 

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

2
Joe