J'ai un projet que je déploie sur Heroku . L'arborescence du code source comprend un tas de fichiers mp3 (le site Web sera pour un projet d'enregistrement dans lequel j'ai été fortement impliqué).
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 au .gitignore
fichier pour les garder hors de mon dépôt.
Cependant, je déploie sur Heroku en utilisant git push heroku
. Les fichiers mp3 doivent être présents dans la branche que je pousse vers Heroku pour qu'ils soient déployés.
Idéalement, j'aimerais .gitignore
les fichiers mp3 dans ma branche principale locale afin que lorsque je les envoie sur GitHub, les mp3 ne soient pas inclus. Ensuite, je garderais une branche de production locale qui a les mp3 commis plutôt que ignorés. Pour déployer, je fusionnais le maître dans la production, puis je poussais la branche de 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 branche master, 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 branche avec ces fichiers validés, comme je le souhaite. Cependant, lorsque je reviens à ma branche principale, Foo.ignored est parti.
Quelqu'un a-t-il des suggestions pour une meilleure façon de configurer cela?
Edit: juste pour clarifier, je veux que les fichiers mp3 soient présents dans les deux branches afin que lorsque je lance le site localement (en utilisant l'une ou l'autre branche) le site fonctionne. Je veux juste que les fichiers soient ignorés dans une branche, donc quand je pousse vers GitHub, ils ne le sont pas non plus. Habituellement .gitignore fonctionne bien pour ce genre de chose (c'est-à-dire garder une copie locale d'un fichier qui n'est pas inclus dans un push vers une télécommande), mais quand je passe à la branche avec les fichiers archivés, puis retourne au branche avec les fichiers ignorés, les fichiers disparaissent.
Réponses:
J'ai écrit un article de blog sur la façon d'utiliser efficacement le
excludesfile
pour différentes branches, comme un pour le github public et un pour le déploiement d'heroku.Voici le rapide et sale:
puis dans le fichier .git / config ajoutez ces lignes:
Maintenant, tous les éléments ignorés globaux sont dans le
info/exclude
fichier et la branche spécifique est dans leinfo/exclude_from_public_viewing
J'espère que cela pourra aider!
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
la source
git init
, ...), et la version de Git que vous avez utilisée?Conseil important : La réponse acceptée par Cognition.Mind ne fonctionne plus (depuis plusieurs années maintenant, ou peut-être pour les versions vanilla de git); voir les commentaires. Une réponse valide et une solution de contournement peuvent être trouvées ici:
https://stackoverflow.com/a/29583813/2157640
Une autre solution de contournement alternative (fonctionnant pour mon problème particulier, mais exigeant des opérations de stockage manuel ou la mise en œuvre d'un hook) serait
git stash -u -a
. Ceci est fastidieux lorsque les différences sont importantes.Et enfin, la solution avec laquelle je vais maintenant est d'avoir forké ma VM dans laquelle nous maintenons notre environnement de développement et configuré de
info/excludes
manière appropriée pour la branche, en supprimant respectivement les fichiers / dossiers incriminés et non validés.la source
Je conseillerais fortement d'envisager de mettre ces fichiers MP3 sur S3. Les faire faire partie de votre poussée Heroku (et donc de votre slug Heroku) ralentira considérablement le temps de démarrage de votre dyno. 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 les frais de stockage de 50 Mo.
la source
Disons que nous voulons ignorer le
build
dossier de toutes les autres branches sauf laproduction
branche. Comme nous voulons pousser lebuild
dossier en production.1)
build
N'incluez pas dans .gitignore. Si vous faites cela, il sera toujours ignoré pour toutes les branches.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) À l'intérieur,
exclude_from_public_viewing
écrivez une ligne (comme vous essayez d'ignorerbuild
toutes les branches).!build
4) Il existe un fichier existant
.git/info/exclude
. Nous devons y ajouter la ligne suivante.Nous voulons ignorer le
build
dossier mais ne l'avons pas ajouté dans .gitignore. Alors, comment git saura quoi ignorer? La réponse est que nous l'ajoutons auexclude
fichier et que nous transmettons conditionnellement ce fichier àgit config
5) Maintenant, nous devons annuler conditionnellement le
build
dossier pour laproduction
branche. pour faire cela, procédez comme suit6) Il existe un fichier existant appelé que
./.git/config
nous devons ajouter suivant -une)
excludesfile = +info/exclude
ci-dessous[core]
b) Créez une nouvelle section à la fin de
./.git/config
asIl existe une solution alternative intelligente. Disons que vous voulez ajouter
build/
dossier dans laproduction
branche et l'ignorer dans toutes les autres branches.1) Ajoutez-le à votre
gitignore
fichier.2) Dans la branche de production, tout en faisant
git add
, forcez l'ajout debuild
dossier:git add -f --all build/
la source
branch.<name>.excludesfile
dans git (plus?), Seulement pourcore.excludesfile
, et mes propres tests semblaient l'affirmer.git version 2.7.4 (Apple Git-66)
et je ne l'ai pas utilisébranch.<name>.excludesfile
dans ma solution.Avez-vous essayé de faire en sorte que .gitignore soit 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.
la source
1. Résumé
J'ajoute à mon
.travis.yml
:Où
misc
- n'importe quel dossier, en contient un autre.gitignore
.mv
Fichier de déplacement de commande UNIX ; écraser, si le fichier existe déjà.Lorsque Travis CI déploie un projet, Travis CI ne poussera pas au déploiement de fichiers et de dossiers de fournisseur , qui ignorent dans
misc/.gitignore
(pas dans l'original.gitignore
des sources).2. Limitations
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 de la branche src vers la branche dest du même référentiel.
Je veux, ce fichier
PaletteMira.suricate-profile
:Si j'ai bien compris l'auteur de la question, il a une tâche similaire.
4.2. src
branche sources - SashaYAML .
Partie de
.travis.yml
:Partie de
.gitignore
:Partie de
misc/.gitignore
*.suricate-profile
pas dedansmisc/.gitignore
.PaletteMira.suricate-profile
n'existe pas dans cette branche à distance, mais existe localement.4.3. dest
succursale de destination - SashaDevelop
Partie de
.gitignore
:*.suricate-profile
pas dedansmisc/.gitignore
.PaletteMira.suricate-profile
existe pour cette branche à distance et localement.4.4. Étapes à suivre pour reproduire
J'active le référentiel PaletteMira GitHub pour Travis CI → Je règle la variable d'environnement
$GITHUB_TOKEN
avec la valeur - mon jeton GitHub → Je fais un commit dans ma branche src.Si aucune erreur, je dois obtenir le comportement attendu .
la source
Pouvez-vous vous engager et pousser depuis Heroku?
par exemple, ajoutez l'audio, poussez-les vers github et dans heroku, supprimez les fichiers de la copie de travail sur Heroku. Supprimez l'audio du référentiel mais pas du disque, puis repoussez cette modification vers github.
la source
Github prend désormais en charge le stockage de fichiers volumineux, voir plus ici https://git-lfs.github.com/
la source