Marquer le fichier comme «non commitable» avec Git

41

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, comme 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?

Adam Carter
la source
1
Suggestion tangentielle: Cette option peut ne pas être applicable sur toutes les plateformes, car certaines sont très attachées aux fichiers de configuration, mais vous pouvez envisager de suivre l'approche de 12 facteurs pour conserver ces paramètres dans l'environnement: 12factor.net/config . C'est-à-dire que le code de l'application ne suppose jamais la présence d'un fichier de configuration. (Par opposition à un script de démarrage privé qui les définit, mais ne quitte jamais votre
ordinateur
1
Si vous les commettez accidentellement, assurez-vous de les supprimer de l'historique complet de git (d'autres questions vous expliqueront comment), car même si vous supprimez et ignorez cette ancienne version validée, elle restera dans l'historique et sera visible sur Github.
curieuxdannii
3
Notez que toutes les réponses ne répondent pas vraiment à votre question. Ils ne rendent pas le fichier inacceptable, ils configurent simplement git pour qu'il l'ignore par défaut. Mais si vous insérez accidentellement ce nom de fichier dans une ligne de commande git, vous pouvez le valider même s'il correspond à un modèle .gitignore. Autant que je sache, il n’existe pas de méthode de contrôle à 100% gitpour éviter de valider un fichier spécifique dans tous les cas. Bien que cela puisse être considéré comme une fonctionnalité ... permettant aux commandes explicites de remplacer les configurations génériques.
Bakuriu
Vous pouvez supprimer les mots de passe codés en dur et passer à une alternative plus sûre. Après cela, vous pouvez changer les mots de passe de la base de données. Les anciens mots de passe sont toujours dans les commits, mais ils sont obsolètes une fois que quelqu'un capable que vous est capable de les lire. Je suis à peu près sûr que vous ne pouvez pas changer un commit une fois qu'il est déjà construit.
BlueWizard
3
En plus des propos de @curiousdannii, GitHub contient une page entière expliquant comment supprimer les données sensibles que vous avez accidentellement commises. Entre autres choses, cette page dit de changer tous les mots de passe et clés que vous avez publiés par accident. help.github.com/articles/remove-sensitive-data
Kevin -

Réponses:

67

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

Tout d’abord, 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, non visibles dans GitHub; si vous avez un fichier validé dans Git, il apparaîtra dans GitHub.

Deuxièmement, il n'y a pas de moyen simple et pratique de jamais marquer un fichier individuel comme étant «non gommable». Mais il existe certainement un moyen d'ignorer un fichier dans un dépôt Git: en ajoutant le (s) fichier (s), y compris leur chemin relatif si nécessaire - dans un .gitignorefichier :

Un .gitignorefichier 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 une base .gitignoreest assez facile puisqu'il ne s'agit que d'un fichier texte brut. Donc, par exemple, si j'avais un config.phpfichier dans votre 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 propre aux 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 config.phpconfigurer le fichier config.SAMPLE.phpet vous pouvez vous assurer que le fichier config.phpn’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 peut-être même penser que vous n'êtes pas compétent parce que vous n'avez pas fourni d'exemple de configuration de base.

JakeGould
la source
11
+1 pour la réponse correcte et suggérant un exemple de fichier de configuration. Certaines bibliothèques, comme Figaro for Ruby, vous poussent dans cette direction. Vous devez avoir un fichier exemple contenant des valeurs similaires à des valeurs réelles afin que la personne qui examine votre code sache à quoi l'environnement devrait ressembler. Certaines plates-formes, telles que Heroku, utilisent des variables d'environnement, vous pouvez donc définir votre configuration sur quelque chose comme database_url = Environment.DATABASE_URLet laisser un commentaire ci-dessus comme # postgres://username:password@localhost/dbname.
Chris Cirefice
@ChrisCirefice Merci! Je suis toujours étonné que de nouveaux «outils» apparaissent qui vous rappellent l'évidence: si ce code doit être lu par d'autres humains, ne pas expliquer le fonctionnement d'une configuration fait quoi exactement? Merci encore.
JakeGould
27

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

Le script appelé pre-commitest 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 cela filenamecorrespond, la validation échoue.

Juho Östman
la source
1
+1 c'est la bonne réponse qui empêche réellement d'ajouter et de valider explicitement le fichier.
R ..
En effet, bien que la pratique recommandée ne repose pas sur la mise en place de cette prévention (utilisez plutôt `.gitignore).
David Z
2
@R .. Oui et non. Alors que la question dit, "marquer un fichier comme étant ucommitable", l'esprit "empêche la sauvegarde d'un fichier". La réalité crée .gitignoreest une pratique très courante - et généralement comprise - pour toute personne utilisant Git. Mais un script de pré-validation n'est pas vraiment utilisé par la plupart des utilisateurs de Git. Cela nécessite une certaine connaissance de la configuration et une vraie raison pour laquelle une méthode comme celle-ci serait préférable à la simple utilisation d'un .gitignorefichier. Mais cela est très utile pour certains cas plus complexes, mais c’est un concept que vous utiliseriez si vous savez vraiment que vous en avez besoin.
JakeGould
2
Je pourrais voir l’utiliser dans des situations où vous ne pouvez pas faire confiance à 100% à .gitignore (vous pourriez faire quelque chose de stupide de demander accidentellement à git d’ajouter le fichier pour validation). Ou peut-être que quelqu'un d'autre pourrait éditer le fichier .gitignore (il est sous contrôle de version, après tout). Si vous avez vraiment besoin d’un processus testable, c’est quelque chose que vous pourriez intégrer à un tel processus.
Cort Ammon
@CortAmmon, il ne s'agit pas toujours de confiance. Vous pouvez ajouter à votre code source des informations de débogage temporaires et non publiques que vous ne voulez pas valider mais que vous ne pouvez pas ignorer ce fichier. Au lieu de cela, vous voulez vérifier avant de commettre s'il ne contient rien d' illégal . Cela semble être une bonne solution pour ce cas d'utilisation. Et en fait, voici comment j'ai trouvé cette question, car c'est mon cas d'utilisation.
t3chb0t
12

Ce que @JakeGould a dit Dans certains cas, vous pouvez également utiliser des bits de fichier spéciaux tels que skip-worktreeou assume-unchangedpouvant être définis de la manière suivante; Pour les différences entre les deux, voir la réponse à ce problème :

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.

phk
la source
8

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

  • .gitignoreempêche les fichiers d'être suivis; s'ils sont déjà suivis, utilisez-les git rm --cachedpour les supprimer
  • les fichiers / modèles $GIT_DIR/info/excludeseront également ignorés
  • Les fichiers / modèles du fichier spécifié par le fichier core.excludesFile dans l'utilisateur ~/.gitconfigsont également ignorés.

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

46 et 2
la source
2

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 .gitignoreà toujours exclure les fichiers portant cette extension de manière globale (en utilisant le .gitconfigfichier tel que mentionné ailleurs pour qu'il soit toujours ignoré pour votre utilisateur).

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

/projectname/mypasswords.exc 

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

Joe
la source