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.
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
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.
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.
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/
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.
J'ajoute à mon .travis.yml
:
before_deploy:
- mv misc/.gitignore .gitignore
Où 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).
Cette réponse est pertinente pour avril 2018. À l'avenir, les données de cette réponse pourraient être obsolètes.
mon projet réel .
Exemple de déploiement réussi .
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
:
Si j'ai bien compris l'auteur de la question, il a une tâche similaire.
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.
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.
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 .
Github prend maintenant en charge le stockage de fichiers volumineux. Plus d'informations ici https://git-lfs.github.com/
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.