Question Faire une "exportation git" (comme "svn export")?


Je me demandais s'il y a une bonne solution "git export" qui crée une copie d'un arbre sans .git répertoire du référentiel. Il y a au moins trois méthodes que je connais:

  1. git clone suivi de la suppression du .git répertoire du référentiel.
  2. git checkout-index fait allusion à cette fonctionnalité, mais commence par "Il suffit de lire l'arbre désiré dans l'index ..." que je ne suis pas entièrement sûr de savoir comment faire.
  3. git-export est un script tiers qui fait essentiellement un git clone dans un endroit temporaire suivi par rsync --exclude='.git' dans la destination finale.

Aucune de ces solutions ne me semble vraiment satisfaisante. Le plus proche de svn export peut être l'option 1, car les deux nécessitent que le répertoire cible soit vide en premier. Mais l'option 2 semble encore mieux, en supposant que je puisse comprendre ce que signifie lire un arbre dans l'index.


2165
2017-10-02 02:21


origine


Réponses:


Probablement le moyen le plus simple d'y parvenir est avec git archive. Si vous n'avez vraiment besoin que de l'arborescence étendue, vous pouvez faire quelque chose comme ça.

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

La plupart du temps que j'ai besoin d'exporter quelque chose de git, je veux une archive compressée dans tous les cas donc je fais quelque chose comme ça.

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

Archive ZIP:

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

git help archive pour plus de détails, c'est assez flexible.


Sachez que même si l'archive ne contient pas le répertoire .git, elle contiendra cependant d'autres fichiers spécifiques à git, tels que .gitignore, .gitattributes, etc. Si vous ne les voulez pas dans l'archive, assurez-vous utilisez l'attribut export-ignore dans un fichier .gitattributes et validez-le avant de faire votre archive. Lire la suite...


Remarque: Si vous souhaitez exporter l'index, la commande est

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

(Voir La réponse de Greg pour plus de détails)


2195
2017-10-02 18:13



J'ai découvert ce que l'option 2 signifie. À partir d'un référentiel, vous pouvez faire:

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

La barre oblique à la fin du chemin est importante, sinon les fichiers seront dans / destination avec un préfixe de 'chemin'.

Puisque dans une situation normale, l'index contient le contenu du référentiel, il n'y a rien de spécial à faire pour "lire l'arbre désiré dans l'index". C'est déjà là.

le -a flag est nécessaire pour extraire tous les fichiers de l'index (je ne suis pas sûr de ce que cela signifie d'omettre ce drapeau dans cette situation, car il ne fait pas ce que je veux). le -f flag force l'écrasement des fichiers existants dans la sortie, ce que cette commande ne fait pas normalement.

Cela semble être le genre de "git export" que je cherchais.


301
2017-10-02 03:03



git archive fonctionne également avec le référentiel distant.

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

Pour exporter un chemin particulier à l'intérieur du repo, ajoutez autant de chemins que vous le souhaitez comme dernier argument à git, par exemple:

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

Un cas spécial répond si le référentiel est hébergé sur GitHub.

Juste utiliser svn export.

Autant que je sache, Github ne permet pas archive --remote. Bien que GitHub soit svn compatible et ils ont tous les git repos svn accessible afin que vous puissiez simplement utiliser svn export comme vous le feriez normalement avec quelques ajustements à votre URL GitHub.

Par exemple, pour exporter un référentiel entier, notez comment trunkdans l'URL remplace master (ou quel que soit le La branche HEAD du projet est configurée pour):

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

Et vous pouvez exporter un seul fichier ou même un certain chemin ou dossier:

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

Exemple avec Bibliothèque jQuery JavaScript

le HEAD branche ou maîtriser branche sera disponible en utilisant trunk:

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

Le non-HEAD  branches sera accessible sous /branches/:

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

Tout Mots clés en dessous de /tags/ de la même manière:

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

48
2017-10-30 17:03



Du Git Manual:

Utiliser git-checkout-index pour "exporter un arbre entier"

La capacité de préfixe rend fondamentalement l'utilisation de git-checkout-index comme une fonction "export as tree". Lisez simplement l'arbre désiré dans l'index, et faites:

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


38
2017-10-02 02:27



J'ai écrit une enveloppe simple autour git-checkout-index que vous pouvez utiliser comme ceci:

git export ~/the/destination/dir

Si le répertoire de destination existe déjà, vous devez ajouter -f ou --force.

L'installation est simple. il suffit de déposer le script quelque part dans votre PATHet assurez-vous que c'est exécutable.

Le référentiel github pour git-export 


37
2017-10-16 17:17



Il semble que c'est moins un problème avec Git qu'avec SVN. Git ne place qu'un dossier .git dans la racine du référentiel, alors que SVN place un dossier .svn dans chaque sous-répertoire. Donc "svn export" évite la magie de ligne de commande récursive, alors qu'avec Git la récursivité n'est pas nécessaire.


35
2018-05-12 04:20



L'équivalent de

svn export . otherpath

à l'intérieur d'un repo existant est

git archive branchname | (cd otherpath; tar x)

L'équivalent de

svn export url otherpath

est

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41



J'utilise largement git-submodules. Celui-ci fonctionne pour moi:

rsync -a ./FROM/ ./TO --exclude='.*'

21
2017-09-13 06:26



Si vous n'excluez pas les fichiers avec .gitattributes  export-ignore Alors essaye git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-F
  Lors de la vérification des chemins à partir de l'index, ne pas échouer sur non fusionné   les entrées; à la place, les entrées non fusionnées sont ignorées.

et

-q
  Évitez verbeux

De plus, vous pouvez obtenir n'importe quelle branche ou étiquette ou d'une révision de validation spécifique comme dans SVN en ajoutant simplement le SHA1 (SHA1 dans Git est l'équivalent du numéro de révision dans SVN)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

le /path/to/checkout/ doit être vide, Git ne supprimera aucun fichier, mais écrasera les fichiers avec le même nom sans aucun avertissement

METTRE À JOUR: Pour éviter le problème décolleté ou pour laisser intact le référentiel actif lors de l'utilisation de la commande pour l'exportation avec des tags, des branches ou SHA1, vous devez ajouter -- ./ à la fin

Le double tiret -- dit git que tout ce qui suit les tirets sont des chemins ou des fichiers, et aussi dans ce cas dit git checkout ne pas changer le HEAD

Exemples:

Cette commande obtiendra juste le répertoire de libs et également le readme.txt fichier de ce commit exactement

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

Cela va créer (écraser) my_file_2_behind_HEAD.txt deux commits derrière la tête HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

Pour obtenir l'exportation d'une autre succursale

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

Remarquerez que ./ est relatif à la racine du référentiel


20
2017-12-10 17:17