Vraag Hoe gebruik ik git, hoe kan ik een bestand in de ene branche negeren, maar het in een andere branche laten uitvoeren?


Ik heb een project waar ik gebruik van maak Heroku. De broncodestructuur bevat een aantal mp3-bestanden (de website is bedoeld voor een opnameproject waar ik nauw bij betrokken was).

Ik wil de broncode ervoor gebruiken GitHub, maar GitHub heeft een limiet van 300 MB op hun gratis accounts. Ik wil 50 MB van mijn limiet niet gebruiken voor een aantal mp3-bestanden. Uiteraard kon ik ze toevoegen aan de .gitignore bestand om ze uit mijn repo te houden.

Ik implementeer echter naar Heroku met git push heroku. De mp3-bestanden moeten aanwezig zijn in de branche die ik push naar Heroku, zodat ze worden ingezet.

In het ideale geval zou ik willen .gitignore de mp3-bestanden in mijn lokale hoofdtak zodat wanneer ik dat naar GitHub push, de mp3's niet worden opgenomen. Dan zou ik een lokale productietak houden waarin de mp3's zijn vastgelegd in plaats van genegeerd. Om te implementeren, zou ik master samenvoegen in productie en vervolgens de productietak naar Heroku duwen.

Ik kan dit niet goed laten werken.

Hier is een voorbeeld van wat ik probeer te doen ...

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

Op dit punt wordt Foo.ignored genegeerd in mijn hoofdtak, maar het is nog steeds aanwezig, dus mijn project kan het gebruiken.

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

Nu heb ik een filiaal met deze bestanden, zoals ik dat wil. Als ik echter terugkeer naar mijn hoofdtak, is Foo.ignored verdwenen.

Heeft iemand suggesties gekregen voor een betere manier om dit op te zetten?

Bewerken: gewoon om te verduidelijken, ik wil dat de mp3-bestanden in beide takken aanwezig zijn, zodat wanneer ik de site lokaal (met een van beide filialen) werk, de site werkt. Ik wil gewoon dat de bestanden in één branch worden genegeerd, dus wanneer ik naar GitHub push, worden ze niet zo goed gepusht. Gewoonlijk werkt .gitignore goed voor dit soort dingen (bijvoorbeeld het bewaren van een lokale kopie van een bestand dat niet wordt opgenomen in een push naar een afstandsbediening), maar wanneer ik overschakel naar het filiaal met de bestanden ingecheckt en dan terug naar de branch met de bestanden genegeerd, verdwijnen de bestanden.


126
2017-12-02 23:55


oorsprong


antwoorden:


Deze oplossing lijkt alleen te werken voor bepaalde, gepatchte versies van git. Zien een nieuw antwoord dat wijst op tijdelijke oplossingen en een ander antwoord en daaropvolgende opmerkingen voor een hint welke versies kunnen werken.

Ik schreef een blogpost over hoe je het programma effectief kunt gebruiken excludesfile voor verschillende branches, zoals een voor openbare github en een voor heroku-implementatie.

Hier is het snel en vies:

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

Voeg dan in het .git / config-bestand deze regels toe:

[core]
excludesfile = +info/exclude


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

Nu zijn alle dingen die wereldwijd worden genegeerd in de info/exclude bestand en de branchespecifieke is in de info/exclude_from_public_viewing

Ik hoop dat het helpt!

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


72
2017-10-28 15:26



Belangrijke tip: Het geaccepteerde antwoord van Cognition.Mind werkt niet (al enkele jaren, of misschien voor vanille-versies van git); zie de reacties. Een geldig antwoord en een oplossing zijn hier te vinden:

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

Een andere alternatieve oplossing (werken voor mijn specifieke probleem, maar veeleisende handmatige opslag of uitvoering van een haak) zou zijn git stash -u -a. Dit is vervelend als de verschillen groot zijn.

En tot slot, de oplossing waar ik nu mee aan de slag ga, is mijn VM gesplitst hebben waar we onze ontwikkelingsomgeving in bewaren en opzetten info/excludes geschikt voor het filiaal, respectievelijk het verwijderen van de aanstootgevende, niet-gecommitteerde bestanden / mappen.


14
2017-09-01 20:31



Ik zou sterk aanraden om die MP3-bestanden op S3 te plaatsen. Als ze deel uitmaken van je Heroku-push (en dus een deel van je Heroku-slug), wordt de opstarttijd van je dyno aanzienlijk vertraagd. Aangezien Heroku EC2 gebruikt, als de bestanden op S3 staan ​​en alleen worden gebruikt door uw app (als gebruikers niet rechtstreeks aan S3 zijn gekoppeld), betaalt u niet eens enige bandbreedtekosten, alleen de kosten om 50 MB op te slaan.


13
2017-12-09 20:27



Laten we zeggen dat we het willen negeren build map van alle andere filiaal behalve production filiaal. Zoals we willen duwen build map in productie.

1) niet inbegrepen build in .gitignore. Als u dat doet, wordt dit voor alle branches altijd genegeerd.

2) Maak een bestand exclude_from_public_viewing binnen ./.git/info (Deze map bestaat al) map touch ./.git/info/exclude_from_public_viewing

3) Binnen exclude_from_public_viewing schrijf een regel (zoals je probeert te negeren build voor alle takken).   !build

4) Er is een bestaand bestand .git/info/exclude . We moeten de volgende regel toevoegen.

 build

We willen negeren build map maar heeft deze niet toegevoegd in .gitignore. Dus hoe weet git wat hij moet negeren? Antwoord is waar we het aan toevoegen exclude bestand en conditioneel doorgeven van dat bestand aan git config

5) Nu moeten we voorwaardelijk negeren build map voor production tak. om dat te doen, volg het volgende

6) Er is een bestaand bestand met de naam ./.git/config we moeten het volgende toevoegen -

een) excludesfile = +info/exclude beneden [core]

[core]
     excludesfile = +info/exclude

b) Maak een nieuw gedeelte aan het einde van ./.git/config als

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

Oplossing 2

Er is een slimme alternatieve oplossing. Laten we zeggen dat je wilt toevoegen build/ map in production brunch en negeer het in alle andere branches.

1) Voeg het toe aan uw gitignore het dossier.

2) In productiebrunch, terwijl je git add toevoegt, force add build map git add -f --all build/


7
2017-09-02 05:46



Heb je geprobeerd om .gitignore anders te laten zijn in jouw branche?

Je zou in staat moeten zijn om te negeren wat je wilt op basis van de branch waar je bent, zolang de bestanden niet worden gevolgd op die branch.


3
2017-12-03 18:03



Kun je je inzetten en pushen van Heroku?

bijv. Voeg de audio toe, druk op github en heroku in, verwijder de bestanden op de werkkopie op Heroku. Verwijder de audio van de repo maar niet van de schijf en duw die wijziging vervolgens terug naar github.


0
2017-12-05 01:43



Github heeft nu ondersteuning voor grote bestandsopslag, zie hier meer https://git-lfs.github.com/


0
2017-07-13 13:47



1. Samenvatting

  1. ik gebruik Travis CI voor het inzetten  (het ondersteunt de implementatie van Heroku)
  2. Ik voeg toe aan mijn .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    Waar misc - elke map, bevat een andere .gitignore.

    mv UNIX-opdracht verplaats bestand; overschrijven, als het bestand al bestaat.

Wanneer Travis CI een project implementeert, zal Travis CI niet pushen naar leverancier inzetten bestanden en mappen die worden genegeerd misc/.gitignore(niet in het origineel .gitignore van bronnen).


2. Beperkingen

  1. Dit antwoord is mogelijk niet geschikt voor alle voorwaarden van de auteur. Maar dit antwoord geeft antwoord op de vraag "Git gebruiken, hoe negeer ik een bestand in de ene branche, maar laat ik het in een andere vestiging uitvoeren?"
  2. Ik ben geen Heroku-gebruiker, mijn voorbeelden voor GitHub, niet voor Heroku. Gegevens van dit antwoord werken voor mij in GitHub, maar werkt mogelijk niet op Heroku.

3. Relevantie

Dit antwoord is relevant voor april 2018. In de toekomst kunnen de gegevens van dit antwoord achterhaald zijn.


4. Demonstratie

mijn echt project.

Voorbeeld van succesvolle implementatie.

4.1. Taak

Ik implementeer mijn project van src branch naar dest branch van dezelfde repository.

Ik wil dat bestand PaletteMira.suricate-profile:

  • Lokale machine - bestaat voor alle filialen,
  • src remote branch - niet bestaat,
  • dest remote branch - bestaat.

Als ik de auteur van de vraag correct heb begrepen, heeft hij een soortgelijke taak.

4.2. src

bronnen branch - SashaYAML.

Deel van .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

Deel van .gitignore:

*.sublime-snippet
*.suricate-profile

Deel van misc/.gitignore

*.sublime-snippet

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

PaletteMira.suricate-profile bestaat niet op afstand in deze branche, maar bestaat lokaal.

4.3. dest

bestemmingstak - SashaDevelop

Deel van .gitignore:

*.sublime-snippet

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

PaletteMira.suricate-profile bestaat voor deze branche ver en lokaal.

4.4. stappen om te reproduceren

Ik schakel PaletteMira GitHub-opslagplaats in voor Travis CI → Ik stel omgevingsvariabele in  $GITHUB_TOKEN met waarde - mijn GitHub-token → Ik sluit me aan bij mijn src-kantoor.

Als er geen fouten zijn, moet ik het krijgen verwacht gedrag.


0
2018-04-24 07:50