web-dev-qa-db-fra.com

Avec git, comment puis-je ignorer un fichier dans une branche mais le faire valider dans une autre branche?

J'ai un projet sur lequel je déploie Herok . L'arborescence du code source comprend un ensemble de fichiers mp3 (le site Web est destiné à un projet d'enregistrement auquel j'ai participé activement).

Je voudrais mettre le code source pour cela sur GitHub , mais GitHub a une limite de 300 Mo sur leurs comptes gratuits. Je ne veux pas utiliser 50 Mo de ma limite sur un tas de fichiers mp3. Évidemment, je pourrais les ajouter à la .gitignore fichier pour les garder hors de mon repo.

Cependant, je me déploie à Heroku en utilisant git Push heroku. Les fichiers mp3 doivent être présents dans la branche I Push to Heroku pour pouvoir être déployés.

Idéalement, j'aimerais .gitignore les fichiers mp3 de ma branche maître locale afin que, lorsque je transmets cela à GitHub, les mp3 ne soient pas inclus. Ensuite, je garderais une branche de production locale dans laquelle les mp3 seraient validés plutôt qu'ignorés. Pour le déployer, je fusionnais maître en production, puis poussais la branche de production vers Heroku.

Je ne peux pas que ça fonctionne 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 branche principale, mais il est toujours présent et peut donc être utilisé par mon projet.

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

Maintenant, j'ai une branche avec ces fichiers validés, comme je le souhaite. Cependant, lorsque je repasse dans ma branche principale, Foo.ignored est parti.

Quelqu'un a-t-il des suggestions pour un meilleur moyen de le configurer?

Éditer: je tiens à préciser que je veux que les fichiers mp3 soient présents dans les deux branches afin que le site fonctionne lorsque je lance le site localement (en utilisant l’une ou l’autre branche). Je veux juste que les fichiers soient ignorés dans une branche, donc quand je pousse sur GitHub, ils ne le sont pas aussi. Généralement, .gitignore fonctionne bien pour ce genre de choses (conserver une copie locale d’un fichier qui n’est pas inclus dans un envoi Push-to-remote), mais lorsque je passe à la branche avec les fichiers archivés, puis branche avec les fichiers ignorés, les fichiers disparaissent.

149
Myron Marston

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

J'ai écrit un article de blog sur la manière d'utiliser efficacement le excludesfile pour différentes branches, comme un pour le github public et un 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 matériel ignorer global se trouve dans le info/exclude fichier et la branche spécifique est dans le fichier info/exclude_from_public_viewing

J'espère que ça t'as aidé!

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

80
Cognition.Mind

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

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

Une autre solution de contournement (pour mon problème particulier, mais exigeant des opérations de stockage manuel ou la mise en œuvre d'un crochet) serait git stash -u -a. C'est fastidieux quand les différences sont grandes.

Et enfin, la solution à laquelle je vais maintenant, c’est d’avoir brouillé mon VM) dans lequel nous conservons notre environnement de développement et de le configurer info/excludes de manière appropriée pour la branche, en supprimant respectivement les fichiers/dossiers incriminés et non engagés.

17
Murphy

Je conseillerais fortement d’envisager de placer ces fichiers MP3 sur S3. Les intégrer à votre Heroku Push (et donc à votre limace Heroku) ralentira considérablement le temps de démarrage de votre dyno. Etant donné que Heroku utilise EC2, si les fichiers se trouvent 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, uniquement les frais de stockage de 50 Mo.

14
David Dollar

Disons que nous voulons ignorer le dossier build de toutes les autres branches, à l'exception de production branch. Comme nous voulons pousser le dossier build en production.

1) Ne pas inclure build dans .gitignore. Si vous faites cela, il sera toujours ignoré pour toutes les branches.

2) Créer un fichier exclude_from_public_viewing à l'intérieur ./.git/info _ (Ce dossier existe déjà) dossier touch ./.git/info/exclude_from_public_viewing

3) à l'intérieur exclude_from_public_viewing écrit une ligne (car vous essayez d’ignorer build pour toutes les branches). !build

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

 build

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

5) Nous devons maintenant unignorer conditionnellement le dossier build pour la branche production. faire cela effectuer suivant

6) Il existe un fichier existant appelé ./.git/config nous devons ajouter ce qui suit -

une) excludesfile = +info/exclude au dessous de [core]

[core]
     excludesfile = +info/exclude

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

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

Solution 2

Il existe une solution alternative intelligente. Disons que vous voulez ajouter build/ dossier dans production branche et l’ignore dans toutes les autres branches.

1) Ajoutez-le à votre fichier gitignore.

2) En production, en faisant git add, force ajouter le dossier build: git add -f --all build/

12
sapy

Avez-vous essayé d'avoir .gitignore différent dans votre branche?

Vous devriez pouvoir ignorer ce que vous voulez en fonction de la branche dans laquelle vous vous trouvez, tant que les fichiers ne sont pas suivis sur cette branche.

4
kEND

1. Résumé

  1. J'utilise Travis CI pour ) déployer ( il supporte le déploiement de 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 n’appliquera pas ) fournisseur de déploiement fichiers et dossiers, qui ignorent dans misc/.gitignore _ (pas dans l'original .gitignore de sources).


2. Limites

  1. Cette réponse peut ne pas convenir à toutes les conditions de l'auteur. Mais cette réponse répond à la question "Avec git, comment puis-je ignorer un fichier dans une branche mais le faire valider dans une autre branche?"
  2. Je ne suis pas un utilisateur 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 pour 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 projet réel .

Exemple de déploiement réussi .

4.1. Tâche

Je déploie mon projet d'une branche src à une branche dest du même référentiel.

Je veux, ce fichier PaletteMira.suricate-profile:

  • Machine locale - existe pour toutes les branches,
  • src branche distante - n'existe pas,
  • branche dist dist - existe.

Si j'ai bien compris l'auteur de la question, il a une tâche similaire.

4.2. src

branche de 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 dedans misc/.gitignore.

PaletteMira.suricate-profile n'existe pas à distance dans cette branche, mais existe localement.

4.3. dest

branche de destination - SashaDevelop

Partie de .gitignore :

*.sublime-snippet

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

PaletteMira.suricate-profile existe pour cette branche () à distance et localement.

4.4. Étapes pour reproduire

J'active le référentiel PaletteMira GitHub pour Travis CI → I définit l'environnement variable $GITHUB_TOKEN avec la valeur - mon jeton GitHub → Je fais un commit dans ma branche src.

Si aucune erreur, je dois obtenir comportement attendu .

3

Github prend maintenant en charge le stockage de fichiers volumineux. Plus d'informations ici https://git-lfs.github.com/

0
John Lozano

Pouvez-vous commettre et pousser de Heroku?

par exemple. Ajoutez l'audio, poussez-les vers github et dans heroku, supprimez les fichiers sur la copie de travail sur Heroku. Supprimez l'audio du référentiel mais pas du disque, puis transmettez cette modification à github.

0
Tom