Usando git, come faccio a ignorare un file in un ramo ma lo faccio in un altro ramo?

Ho un progetto che sto schierando su Heroku . L’albero del codice sorgente include un mucchio di file mp3 (il sito Web sarà per un progetto di registrazione con il quale sono stato pesantemente coinvolto).

Mi piacerebbe mettere il codice sorgente su GitHub , ma GitHub ha un limite di 300 MB sui loro account gratuiti. Non voglio usare 50 MB del mio limite su un mucchio di file mp3. Ovviamente, potrei aggiungerli al file .gitignore per tenerli fuori dal mio repo.

Comunque, mi git push heroku su Heroku usando git push heroku . I file mp3 devono essere presenti nel ramo che invio a Heroku in modo che vengano distribuiti.

Idealmente, mi piacerebbe .gitignore i file mp3 nel mio ramo master locale in modo che quando li spingo su GitHub, gli mp3 non sono inclusi. Quindi terrei un ramo di produzione locale che ha commesso gli mp3 piuttosto che ignorati. Per implementare, unirei il master alla produzione, quindi spingere il ramo di produzione in Heroku.

Non riesco a farlo funzionare correttamente.

Ecco un esempio di ciò che sto cercando di fare …

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

A questo punto, Foo.ignored viene ignorato nel mio ramo master, ma è ancora presente, quindi il mio progetto può usarlo.

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

Ora ho un ramo con questi file commessi, come voglio. Tuttavia, quando torno al mio ramo principale, Foo.ignored non c’è più.

Qualcuno ha qualche suggerimento per un modo migliore per impostare questo?

Modifica: per chiarire, voglio che i file mp3 siano presenti in entrambi i rami in modo tale che quando eseguo il sito localmente (utilizzando uno dei due rami) il sito funzioni. Voglio solo che i file vengano ignorati in un ramo, quindi quando spingo su GitHub non vengono nemmeno spinti. Solitamente .gitignore funziona bene per questo tipo di cose (ad esempio mantenendo una copia locale di un file che non viene incluso in un push su un telecomando), ma quando passo al ramo con i file registrati, e poi di nuovo al ramo con i file ignorati, i file spariscono.

Questa soluzione sembra funzionare solo per determinate versioni di git patchate. Vedere una nuova risposta che punta a soluzioni alternative e un’altra risposta e commenti successivi per un suggerimento su quali versioni potrebbero funzionare.

Ho scritto un post sul blog su come utilizzare in modo efficace il file excludesfile per diversi rami, come uno per il github pubblico e uno per la distribuzione di heroku.

Ecco il veloce e sporco:

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

quindi nel file .git / config aggiungere queste righe:

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

Ora tutto il materiale di info/exclude_from_public_viewing globale si trova nel file info/exclude e il ramo specifico è nelle info/exclude_from_public_viewing

Spero possa aiutare!

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

Suggerimento importante : la risposta accettata da Cognition.Mind non funziona (più, per diversi anni, o forse per le versioni vanilla di git); guarda i commenti Una risposta valida e una soluzione alternativa possono essere trovate qui:

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

Un’altra soluzione alternativa (lavorando per il mio problema particolare, ma richiedendo operazioni di stash manuale o implementazione di un hook) sarebbe git stash -u -a . Questo è noioso quando le differenze sono grandi.

Infine, la soluzione con cui sto andando avanti è quella di avere biforcuta la mia macchina virtuale in cui teniamo il nostro ambiente di sviluppo e di impostare info/excludes le info/excludes appropriato per il ramo, eliminando rispettivamente i file / cartelle offensivi e non vincolanti.

Vi consiglio caldamente di prendere in considerazione l’idea di mettere quei file MP3 su S3. Farli partecipare alla tua spinta Heroku (e quindi parte del tuo slug Heroku) rallenterà notevolmente il tuo tempo di avvio del banco. Siccome Heroku utilizza EC2, se i file sono su S3 e sono accessibili solo dalla tua app (se gli utenti non sono direttamente collegati a S3) non pagherai nemmeno alcuna spesa per la larghezza di banda, ma solo il costo per memorizzare 50 MB.

Diciamo che vogliamo ignorare la cartella di build da tutti gli altri rami eccetto il ramo di production . Come vogliamo spingere la cartella build in produzione.

1) Non includere build in .gitignore. Se lo fai, verrà sempre ignorato per tutti i rami.

2) Crea un file exclude_from_public_viewing all’interno della cartella ./.git/info (questa cartella esiste già) touch ./.git/info/exclude_from_public_viewing

3) All’interno di exclude_from_public_viewing scrivi una riga (mentre stai cercando di ignorare la build per tutti i rami). !build

4) C’è un file esistente .git/info/exclude . Dobbiamo aggiungere la seguente linea in esso.

  build 

Vogliamo ignorare la cartella di build ma non l’ho aggiunta in .gitignore. Quindi come farà a sapere cosa ignorare? La risposta è che lo stiamo aggiungendo per exclude file e passare in modo condizionale quel file a git config

5) Ora dobbiamo annullare condizionalmente la cartella di build per il ramo di production . per farlo esegui seguendo

6) C’è un file esistente chiamato ./.git/config dobbiamo aggiungere quanto segue:

a) excludesfile = +info/exclude sotto [core]

 [core] excludesfile = +info/exclude 

b) Crea una nuova sezione alla fine di ./.git/config as

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

Soluzione 2

C’è una soluzione alternativa intelligente. Diciamo che vuoi aggiungere build/ folder nel brunch di production e ignorarlo in tutti gli altri rami.

1) Aggiungilo al tuo file gitignore .

2) Nel brunch di produzione, mentre si fa git add, forza aggiungi la cartella build git add -f --all build/

Hai provato ad avere .gitignore essere diversi nella tua filiale?

Dovresti essere in grado di ignorare ciò che vuoi in base al ramo in cui ti trovi fintanto che i file non sono tracciati su quel ramo.

Puoi commettere e spingere da Heroku?

Ad esempio aggiungi l’audio, spingili su github e in heroku, rimuovi i file sulla copia di lavoro su Heroku. Rimuovi l’audio dal repository ma non dal disco, quindi trasferiscilo in github.

Github ora ha il supporto per l’archiviazione di file di grandi dimensioni, vedere di più qui https://git-lfs.github.com/

1. Riepilogo

  1. Uso Travis CI per la distribuzione ( supporta la distribuzione di Heroku )
  2. Aggiungo al mio .travis.yml :

     before_deploy: - mv misc/.gitignore .gitignore 

    Dove misc – qualsiasi cartella, contiene un altro .gitignore .

    mv UNIX command move file; sovrascrivi, se il file esiste già.

Quando Travis CI distribuisce il progetto, Travis CI non spinge a distribuire file e cartelle del provider , che ignorano in misc/.gitignore (non nel originale .gitignore di fonti).


2. Limitazioni

  1. Questa risposta potrebbe non essere adatta a tutte le condizioni dell’autore. Ma questa risposta risponde alla domanda “Usando git, come faccio a ignorare un file in un ramo ma lo faccio in un altro ramo?”
  2. Non sono un utente di Heroku, i miei esempi per GitHub , non per Heroku. I dati di questa risposta funzionano per me in GitHub, ma potrebbe non funzionare su Heroku.

3. Rilevanza

Questa risposta è rilevante per aprile 2018. In futuro, i dati di questa risposta potrebbero essere obsoleti.


4. Dimostrazione

il mio vero progetto .

Esempio di distribuzione riuscita .

4.1. Compito

Distribuisco il mio progetto dal ramo src al ramo dest dello stesso repository.

Voglio, quel file PaletteMira.suricate-profile :

  • Macchina locale – esiste per tutti i rami,
  • ramo remoto src – non esiste,
  • dest remote branch – esiste.

Se ho capito correttamente l’autore della domanda, ha un compito simile.

4.2. src

ramo delle fonti – SashaYAML .

Parte di .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 

Parte di .gitignore :

 *.sublime-snippet *.suricate-profile 

Parte di misc/.gitignore

 *.sublime-snippet 

*.suricate-profile non in misc/.gitignore .

PaletteMira.suricate-profile non esiste in questo ramo da remoto, ma esiste localmente.

4.3. dest

filiale di destinazione – SashaDevelop

Parte di .gitignore :

 *.sublime-snippet 

*.suricate-profile non in misc/.gitignore .

PaletteMira.suricate-profile esiste per questo ramo da remoto e localmente.

4.4. Passi per riprodurre

Abilito il repository GitHub di PaletteMira per Travis CI → Ho impostato la variabile di ambiente $GITHUB_TOKEN con valore – il mio token GitHub$GITHUB_TOKEN qualsiasi commit al mio ramo src.

Se nessun errore, devo ottenere il comportamento previsto .