En utilisant git, comment puis-je ignorer un fichier dans une twig mais l’avoir commis dans une autre twig?

J’ai un projet que je déploie sur Heroku . L’arbre de code source comprend un tas de fichiers mp3 (le site Web sera destiné à un projet d’enregistrement auquel j’étais fortement impliqué).

Je voudrais mettre le code source sur GitHub , mais GitHub a une limite de 300 Mo sur ses comptes gratuits. Je ne veux pas utiliser 50 Mo de ma limite sur un tas de fichiers mp3. De toute évidence, je pourrais les append au fichier .gitignore pour les garder hors de mon repo.

Cependant, je déploie sur Heroku en utilisant le git push heroku . Les fichiers mp3 doivent être présents dans la twig que je transmets à Heroku pour qu’ils soient déployés.

Dans le .gitignore des .gitignore , je voudrais .gitignore les fichiers mp3 de ma twig master locale de sorte que lorsque je les envoie à GitHub, les mp3 ne sont pas inclus. Ensuite, je garderais une twig de production locale avec les mp3s commis au lieu de les ignorer. Pour me déployer, je fusionnerais master en production, puis transférer la twig production vers Heroku.

Je ne peux pas faire fonctionner ça correctement.

Voici un exemple de ce que j’essaie de faire …

 $ git init git-ignore-test $ cd git-ignore-test $ echo "*.ignored" >> .gitignore $ git add .gitignore && git commit -m "Ignore .ignored files" $ touch Foo.ignored 

À ce stade, Foo.ignored est ignoré dans ma twig principale, mais il est toujours présent, donc mon projet peut l’utiliser.

 $ git checkout -b unignored $ cat /dev/null > .gitignore $ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files" 

Maintenant, j’ai une twig avec ces fichiers validés, comme je le souhaite. Cependant, lorsque je reviens à ma twig principale, Foo.ignored est parti.

Quelqu’un at-il des suggestions pour une meilleure façon de le configurer?

Edit: juste pour clarifier, je veux que les fichiers mp3 soient présents dans les deux twigs de sorte que lorsque je lance le site localement (en utilisant l’une ou l’autre twig), le site fonctionne. Je veux juste que les fichiers soient ignorés dans une twig alors quand je pousse vers GitHub ils ne sont pas poussés aussi bien. Habituellement, .gitignore fonctionne bien pour ce genre de chose (c.-à-d. Conserver une copie locale d’un fichier qui n’est pas inclus dans un push vers une télécommande), mais lorsque je passe à la twig avec les fichiers archivés, puis reviens à la twig avec les fichiers ignorés, les fichiers disparaissent.

Cette solution ne semble fonctionner que pour certaines versions corrigées de git. Voir une nouvelle réponse pointant vers des solutions de contournement et une autre réponse et des commentaires ultérieurs pour un indice sur les versions qui peuvent fonctionner.

J’ai écrit un article sur l’utilisation efficace du fichier excludes pour différentes twigs, comme une pour le github public et une pour le déploiement de heroku.

Voici le rapide et sale:

 $ git branch public_viewing $ cd .git/ $ touch info/exclude_from_public_viewing $ echo "path/to/secret/file" > info/exclude_from_public_viewing 

puis dans le fichier .git / config ajoutez ces lignes:

 [core] excludesfile = +info/exclude [branch "public_viewing"] excludesfile = +info/exclude_from_public_viewing 

Maintenant, tout le contenu global ignore est dans le fichier info/exclude et la twig spécifique est dans info/exclude_from_public_viewing

J’espère que cela pourra aider!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-twigs

Conseil important : la réponse acceptée par Cognition.Mind ne fonctionne plus (depuis plusieurs années maintenant, ou peut-être pour les versions vanillées de git); voir les commentaires Une réponse et une solution de contournement valides peuvent être trouvées ici:

https://stackoverflow.com/a/29583813/2157640

Une autre solution de rechange (travailler pour mon problème particulier, mais exiger des opérations de stockage manuel ou l’implémentation d’un hook) serait git stash -u -a . C’est fastidieux quand les différences sont grandes.

Et enfin, la solution que je vais utiliser consiste à installer ma machine virtuelle dans notre environnement de développement, et à configurer les info/excludes appropriées pour la twig, en supprimant respectivement les fichiers / dossiers non validés.

Je vous conseille fortement de mettre ces fichiers MP3 sur S3. Le fait de les intégrer à votre programme Heroku (et donc à votre slug Heroku) ralentira considérablement votre temps de démarrage. Puisque Heroku utilise EC2, si les fichiers sont sur S3 et ne sont accessibles que par votre application (si les utilisateurs ne sont pas directement liés à S3), vous ne paierez même pas de frais de bande passante, seulement 50 Mo pour stocker.

Disons que nous voulons ignorer le dossier de build de toute autre twig, à l’exception de production twig de production . Comme nous voulons pousser le dossier de build en production.

1) N’incluez pas la build dans .gitignore. Si vous faites cela, il sera toujours ignoré pour toutes les twigs.

2) Créez un fichier exclude_from_public_viewing dans le dossier ./.git/info (Ce dossier existe déjà) touch ./.git/info/exclude_from_public_viewing

3) Inside exclude_from_public_viewing écrivez une ligne (comme vous essayez d’ignorer la build pour toutes les twigs). !build

4) Il existe un fichier existant .git/info/exclude . Nous devons y append la ligne suivante.

  build 

Nous voulons ignorer le dossier de build mais ne l’a pas ajouté dans .gitignore. Alors, comment Git saura quoi ignorer? La réponse est que nous l’ajoutons pour exclude fichier et pour passer conditionnellement ce fichier à git config

5) Maintenant, nous devons conditionner de manière conditionnelle le dossier de build pour production twig de production . faire cela effectuer suivant

6) Il existe un fichier existant appelé ./.git/config nous devons append –

a) excludesfile = +info/exclude ci-dessous [core]

 [core] excludesfile = +info/exclude 

b) Créez une nouvelle section à la fin de ./.git/config as

 [branch "production"] excludesfile = +info/exclude_from_public_viewing 

Solution 2

Il existe une solution alternative intelligente. Disons que vous souhaitez append build/ folder dans le brunch de production et l’ignorer dans toutes les autres twigs.

1) Ajoutez-le à votre fichier gitignore .

2) Dans le brunch de production, tout en ajoutant git, forcez à append le dossier de build git add -f --all build/

Avez-vous essayé d’avoir .gitignore différent dans votre twig?

Vous devriez pouvoir ignorer ce que vous voulez en fonction de la twig dans laquelle vous vous trouvez, à condition que les fichiers ne soient pas suivis sur cette twig.

Pouvez-vous vous engager et pousser depuis Heroku?

Par exemple, ajoutez l’audio, poussez-les dans github et dans heroku, supprimez les fichiers de la copie de travail sur Heroku. Supprimez l’audio du repo mais pas du disque, puis repoussez ce changement en github.

Github prend désormais en charge le stockage de fichiers volumineux, voir plus ici https://git-lfs.github.com/

1. Résumé

  1. J’utilise Travis CI pour le déploiement ( prend en charge le déploiement Heroku )
  2. J’ajoute à mon .travis.yml :

     before_deploy: - mv misc/.gitignore .gitignore 

    misc – n’importe quel dossier, contient un autre .gitignore .

    mv commande UNIX déplacer le fichier; écraser, si le fichier existe déjà.

Lorsque Travis CI déploie un projet, Travis CI ne pousse pas au déploiement des fichiers et des dossiers de fournisseurs , qui ignorent les fichiers misc/.gitignore (et non les sources d’origine .gitignore ).


2. Limitations

  1. Cette réponse peut ne pas convenir à toutes les conditions de l’auteur. Mais cette réponse répond à la question «Utiliser git, comment puis-je ignorer un fichier dans une twig mais l’avoir commis dans une autre twig?
  2. Je ne suis pas un utilisateur de Heroku, mes exemples pour GitHub , pas pour Heroku. Les données de cette réponse fonctionnent pour moi dans GitHub, mais peuvent ne pas fonctionner sur Heroku.

3. Pertinence

Cette réponse est pertinente pour avril 2018. À l’avenir, les données de cette réponse pourraient être obsolètes.


4. Démonstration

mon vrai projet

Exemple de déploiement réussi .

4.1. Tâche

Je déploie mon projet depuis la twig src vers la twig dest du même référentiel.

Je veux, ce fichier PaletteMira.suricate-profile :

  • Machine locale – existe pour toutes les twigs,
  • src remote branch – n’existe pas,
  • dest remote branch – existe.

Si j’ai bien compris l’auteur de la question, il a la même tâche.

4.2. src

twig des sources – SashaYAML .

Partie de .travis.yml :

 before_deploy: - mv misc/.gitignore .gitignore deploy: provider: pages on: branch: SashaYAML keep-history: true skip-cleanup: true target-branch: SashaDevelop repo: Kristinita/PaletteMira github-token: $GITHUB_TOKEN committer-from-gh: true project-name: PaletteMira verbose: true 

Partie de .gitignore :

 *.sublime-snippet *.suricate-profile 

Partie de misc/.gitignore

 *.sublime-snippet 

*.suricate-profile pas dans misc/.gitignore .

PaletteMira.suricate-profile n’existe pas dans cette twig à distance, mais existe localement.

4.3. dest

twig de destination – SashaDevelop

Partie de .gitignore :

 *.sublime-snippet 

*.suricate-profile pas dans misc/.gitignore .

PaletteMira.suricate-profile existe pour cette twig à distance et localement.

4.4. Étapes pour reproduire

J’active le référentiel GitHub PaletteMira pour Travis CI → Je mets la variable d’environnement $GITHUB_TOKEN avec la valeur – mon jeton GitHub → Je m’engage dans ma twig src.

Si aucune erreur, je dois avoir le comportement attendu .