Vraag Doe een "git export" (zoals "svn export")?


Ik heb me afgevraagd of er een goede "git export" -oplossing is die een kopie van een boom maakt zonder de .git repository directory. Er zijn minstens drie methoden die ik ken:

  1. git clone gevolgd door het verwijderen van de .git repository directory.
  2. git checkout-index verwijst naar deze functionaliteit maar begint met "Lees gewoon de gewenste boom in de index ...", waarvan ik niet helemaal zeker weet hoe dat moet.
  3. git-export is een script van een derde partij dat in wezen een git clone naar een tijdelijke locatie gevolgd door rsync --exclude='.git' naar de eindbestemming.

Geen van deze oplossingen lijkt mij echt bevredigend. De dichtstbijzijnde die er is svn export kan optie 1 zijn, omdat beide vereisen dat de doelmap eerst leeg is. Maar optie 2 lijkt nog beter, ervan uitgaande dat ik kan uitzoeken wat het betekent om een ​​boom in de index te lezen.


2165
2017-10-02 02:21


oorsprong


antwoorden:


Waarschijnlijk de eenvoudigste manier om dit te bereiken is met git archive. Als je echt alleen de uitgevouwen boom nodig hebt, kun je zoiets als dit doen.

git archive master | tar -x -C /somewhere/else

Meestal moet ik iets van git 'exporteren', ik wil in elk geval een gecomprimeerd archief, dus ik doe zoiets als dit.

git archive master | bzip2 >source-tree.tar.bz2

ZIP-archief:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive voor meer details, het is vrij flexibel.


Let op: hoewel het archief de .git-map niet bevat, bevat het echter ook andere verborgen git-specifieke bestanden zoals .gitignore, .gitattributes, etc. Als je ze niet in het archief wilt hebben, zorg dan dat je gebruik het kenmerk 'exporteren negeren' in een GITATtributes-bestand en leg dit vast voordat u uw archief uitvoert. Lees verder...


Opmerking: als u geïnteresseerd bent in het exporteren van de index, is de opdracht

git checkout-index -a -f --prefix=/destination/path/

(Zien Greg's antwoord voor meer details)


2195
2017-10-02 18:13



Ik heb ontdekt wat optie 2 betekent. Vanuit een repository kunt u het volgende doen:

git checkout-index -a -f --prefix=/destination/path/

De schuine streep aan het einde van het pad is belangrijk, anders leidt dit ertoe dat de bestanden in / bestemming zijn met een voorvoegsel van 'pad'.

Omdat in een normale situatie de index de inhoud van de repository bevat, is er niets bijzonders aan te doen om "de gewenste boom in de index te lezen". Het is er al.

De -a vlag is vereist om alle bestanden in de index te bekijken (ik weet niet zeker wat het betekent om deze vlag weg te laten in deze situatie, omdat het niet doet wat ik wil). De -f vlagtroepen overschrijven bestaande bestanden in de uitvoer, wat deze opdracht normaal niet doet.

Dit lijkt het soort "git-export" te zijn waarnaar ik op zoek was.


301
2017-10-02 03:03



git archive werkt ook met externe repository.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Als u een bepaald pad binnen de repo wilt exporteren, voegt u zoveel paden toe als u wilt als laatste argument om te gieten, bijvoorbeeld:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



enter image description here

Een speciaal antwoord als de repository wordt gehost op GitHub.

Gebruik gewoon svn export.

Voor zover ik weet, staat Github dat niet toe archive --remote. Hoewel GitHub dat is svn compatibel en ze hebben alle git repo's svn toegankelijk zodat je het gewoon zou kunnen gebruiken svn export zoals je normaal zou doen met een paar aanpassingen aan je GitHub-URL.

Als u bijvoorbeeld een volledige repository wilt exporteren, let dan op hoe trunkin de URL wordt vervangen master (of wat dan ook project HEAD branch is ingesteld op):

svn export https://github.com/username/repo-name/trunk/

En u kunt een enkel bestand of zelfs een bepaald pad of een bepaalde map exporteren:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Voorbeeld met jQuery JavaScript-bibliotheek

De HEAD tak of meester filiaal zal beschikbaar zijn via trunk:

svn ls https://github.com/jquery/jquery/trunk

De niet-HEAD  takken zal toegankelijk zijn onder /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Alle labels onder /tags/ op dezelfde manier:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



Van de Git Manual:

Git-checkout-index gebruiken om "een volledige boom te exporteren"

De prefix-mogelijkheid maakt het in principe triviaal om git-checkout-index te gebruiken als een "export als boom" -functie. Lees gewoon de gewenste boom in de index en doe:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



Ik heb een eenvoudige verpakking rond geschreven git-checkout-index die je als volgt kunt gebruiken:

git export ~/the/destination/dir

Als de bestemmingsdirectory al bestaat, moet u deze toevoegen -f of --force.

Installatie is eenvoudig; laat het script ergens in je plaatsen PATH, en zorg ervoor dat het uitvoerbaar is.

De github-repository voor git-export 


37
2017-10-16 17:17



Het lijkt erop dat dit minder een probleem is met Git dan met SVN. Git plaatst alleen een .git-map in de root van de repository, terwijl SVN een .svn-map in elke submap plaatst. Dus "svn export" vermijdt recursieve opdrachtregel magie, terwijl met Git recursie niet nodig is.


35
2018-05-12 04:20