Je me demandais s'il existe une bonne solution "git export" qui crée une copie d'une arborescence sans le .git
répertoire du référentiel. Il y a au moins trois méthodes que je connais:
git clone
suivi de la suppression du.git
répertoire du référentiel.git checkout-index
fait allusion à cette fonctionnalité mais commence par "Il suffit de lire l'arborescence souhaitée dans l'index ..." que je ne sais pas trop comment faire.git-export
est un script tiers qui fait essentiellement ungit clone
dans un emplacement temporaire suivi dersync --exclude='.git'
la destination finale.
Aucune de ces solutions ne me semble vraiment satisfaisante. L' svn export
option la plus proche pourrait être l'option 1, car les deux nécessitent que le répertoire cible soit vide en premier. Mais l'option 2 semble encore meilleure, en supposant que je puisse comprendre ce que signifie lire un arbre dans l'index.
git
export
git-archive
svn-export
Greg Hewgill
la source
la source
git archive --format zip --output "output.zip" master -0
vous donnera une archive non compressée (-0 est le drapeau pour non compressé). git-scm.com/docs/git-archive .export
un sous-répertoire de 250 Ko directement à partir du référentiel distant (qui pourrait autrement avoir une taille de 200 Mo, hors révisions) - et je ne toucherai le réseau que pour un transfert de téléchargement de 250 Ko (ou plus). Avecgit
,archive
doit être activé sur le serveur (donc je ne peux pas l'essayer) - àclone --depth 1
partir du serveur peut toujours récupérer un dépôt de disons 25 Mo, où le.git
sous - dossier à lui seul prend 15 Mo. Par conséquent, je dirais toujours que la réponse est "non".git checkout-index
git archive -o latest.zip HEAD
Réponses:
Le moyen le plus simple d'y parvenir est probablement de
git archive
. Si vous avez vraiment besoin de l'arborescence développée, vous pouvez faire quelque chose comme ça.La plupart du temps, j'ai besoin d'exporter quelque chose de git, je veux en tout cas une archive compressée, donc je fais quelque chose comme ça.
Archive ZIP:
git help archive
pour plus de détails, c'est assez flexible.Sachez que même si l'archive ne contiendra pas le répertoire .git, elle contiendra cependant d'autres fichiers spécifiques à git cachés comme .gitignore, .gitattributes, etc. Si vous ne les voulez pas dans l'archive, assurez-vous de 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
(Voir la réponse de Greg pour plus de détails)
la source
git archive --format zip --output /full/path master
git archive --format zip --output /path/to/file.zip --prefix=newdir/ master
la sortie, elle s'appellera «file.zip» mais lorsque vous la décompressez, le répertoire de niveau supérieur sera «newdir». (Si vous omettez l'attribut --prefix, le répertoire de niveau supérieur serait 'file'.)git archive -o latest.zip HEAD
il crée une archive Zip qui contient le contenu du dernier commit sur la branche courante. Notez que le format de sortie est déduit de l'extension du fichier de sortie.J'ai découvert ce que signifie l'option 2. À partir d'un référentiel, vous pouvez faire:
La barre oblique à la fin du chemin est importante, sinon elle entraînera que les fichiers se trouvent dans / destination avec un préfixe «chemin».
Comme 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'arborescence souhaitée dans l'index". C'est déjà là.
Le
-a
drapeau est requis pour extraire tous les fichiers de l'index (je ne sais pas ce que cela signifie d'omettre ce drapeau dans cette situation, car il ne fait pas ce que je veux). L'-f
indicateur force l'écrasement de tous les fichiers existants dans la sortie, ce que cette commande ne fait normalement pas.Cela semble être le genre de "git export" que je recherchais.
la source
git add
commande modifie le contenu de l'index, donc tout ce quigit status
apparaît comme "à valider" correspond aux différences entre HEAD et le contenu de l'index.~
(pas'~'
!) Sera créé dans votre répertoire de travail. Il n'y a rien de spécialgit checkout-index
à cet égard: la même chose est vraie demkdir '~/dest'
( ne faites pas ça! ). Encore une autre bonne raison d'éviter les noms de fichiers qui doivent être cités (par exemple, qui contiennent un espace) :-)git archive
fonctionne également avec le référentiel distant.Pour exporter un chemin particulier à l'intérieur du référentiel, ajoutez autant de chemins que vous le souhaitez comme dernier argument à git, par exemple:
la source
git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -
(assure que votre archive est dans un dossier)git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master
Et j'ai été fatal: Opération non prise en charge par le protocole. Fin inattendue du flux de commandes.curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
par docsUne réponse à un cas particulier si le référentiel est hébergé sur GitHub.
Utilisez simplement
svn export
.Autant que je sache, Github ne le permet pas
archive --remote
. Bien que GitHub soit compatible svn et que tous les dépôts git soientsvn
accessibles, vous pouvez simplement les utilisersvn export
comme vous le feriez normalement avec quelques ajustements à votre URL GitHub.Par exemple, pour exporter un référentiel entier, notez comment
trunk
dans l'URL remplacemaster
(ou quel que soit le branchement HEAD du projet ):Et vous pouvez exporter un seul fichier ou même un certain chemin ou dossier:
Exemple avec la bibliothèque JavaScript jQuery
La
HEAD
branche ou maître branche sera disponible à l' aidetrunk
:Les non-
HEAD
succursales seront accessibles sous/branches/
:Tous les tags sous
/tags/
de la même manière:la source
git archive
fonctionne très bien avec GitHub, tant que vous utilisez le protocole git, remplacez simplementhttps://
pargit://
dans l'URL. Je ne sais pas pourquoi GitHub ne fait pas de publicité sur cette fonctionnalité cachée.fatal: The remote end hung up unexpectedly
. J'ai essayé sur deux serveurs différents avec jQuery github repo.git config url.<base>.insteadOf
pour mettre en cache le référentiel distant. J'utilisais donc unefile://
URL en réalité. Je doute que celagit archive
puisse jamais fonctionner avec desgit://
URL car il doit pouvoir fonctionnergit-upload-archive
à l'extrémité distante. Cela devrait être possible en utilisant lessh
protocole, sauf que github ne le permet pas (Invalid command: 'git-upload-archive'
).Depuis le manuel Git :
Utiliser git-checkout-index pour "exporter un arbre entier"
La capacité de préfixe rend fondamentalement trivial l'utilisation de git-checkout-index comme une fonction "exportation sous forme d'arbre". Il suffit de lire l'arbre souhaité dans l'index et de faire:
$ git checkout-index --prefix=git-export-dir/ -a
la source
git read-tree bar:foo
Etgit checkout-index --prefix=export_dir/ -a
après cela, vous devriez peut-être le fairegit update-index master
J'ai écrit un simple wrapper
git-checkout-index
que vous pouvez utiliser comme ceci:Si le répertoire de destination existe déjà, vous devrez ajouter
-f
ou--force
.L'installation est simple; déposez simplement le script quelque part dans votre
PATH
, et assurez-vous qu'il est exécutable.Le référentiel github pour
git-export
la source
Il semble que ce soit moins un problème avec Git qu'avec SVN. Git place uniquement un dossier .git dans la racine du référentiel, tandis que SVN place un dossier .svn dans chaque sous-répertoire. Donc, "svn export" évite la magie récursive en ligne de commande, alors qu'avec Git la récursivité n'est pas nécessaire.
la source
L'équivalent de
à l'intérieur d'un référentiel existant est
L'équivalent de
est
la source
git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... Cependant, l'archivage avec horodatages n'est pas exactement trivial, donc j'ai posté un exemple ci-dessous .git archive branchname | tar xC otherpath
C
option de tar est uniquement GNU Tar.Si vous n'excluez pas de fichiers avec,
.gitattributes
export-ignore
essayezgit checkout
et
De plus, vous pouvez obtenir n'importe quelle branche ou étiquette ou à partir d'une révision de validation spécifique comme dans SVN en ajoutant simplement SHA1 (SHA1 dans Git est l'équivalent du numéro de révision dans SVN)
Le
/path/to/checkout/
doit être vide, Git ne supprimera aucun fichier, mais écrasera les fichiers du même nom sans aucun avertissementMISE À JOUR: Pour éviter le problème décapité ou pour laisser intact le référentiel de travail lors de l'utilisation de la caisse pour l'exportation avec des balises, des branches ou SHA1, vous devez ajouter
-- ./
à la finLe double tiret
--
indique à git que tout ce qui se trouve après les tirets sont des chemins ou des fichiers, et dans ce cas, indique égalementgit checkout
de ne pas modifier leHEAD
Exemples:
Cette commande obtiendra uniquement le répertoire libs et également le
readme.txt
fichier de ce commitCela va créer (écraser)
my_file_2_behind_HEAD.txt
deux commits derrière la têteHEAD^2
Pour obtenir l'exportation d'une autre branche
Notez que
./
c'est relatif à la racine du référentiella source
J'utilise largement les sous-modules git. Celui-ci fonctionne pour moi:
la source
.htaccess
?rsync
liste des arguments comme--cvs-exclude
. De plus, il copie encore.gitattributes
et.gitignore
J'ai souvent visité cette page lorsque je cherche un moyen d'exporter un référentiel git. Ma réponse à cette question considère trois propriétés que svn export a par conception par rapport à git, car svn suit une approche de référentiel centralisé:
L'exportation d'une certaine branche à l'aide de svn s'effectue en spécifiant le chemin approprié
Lors de la construction d'une certaine version, il est utile de cloner une branche stable comme par exemple
--branch stable
ou--branch release/0.9
.la source
git archive | tar
approche n'est pas applicable aux environnements de shell incompatibles avec POSIX (par exemple, le CMD d'AppVeyor ou le CI basé sur PowerShell), ce qui n'est pas idéal. L'git checkout
approche modifie l'index de l'arbre de travail principal, ce qui est affreux. L'git checkout-index
approche nécessite que l'index de l'arbre de travail principal soit modifié au préalable, ce qui est encore pire. L'git clone
approche traditionnelle clone l'intégralité de l'historique du référentiel avant de supprimer cette histoire, ce qui est inutile. C'est la seule solution saine qui reste.file://
protocole (par exemple,git clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo
). Si vous ne le faites pas, vous émettez"warning: --depth is ignored in local clones; use file:// instead."
et effectuez un clone standard plutôt que superficiel, ce qui va à l'encontre de l'objectif de cette réponse. Salud!Cela copiera tout le contenu, moins les fichiers .dot. Je l'utilise pour exporter des projets git clonés dans le dépôt git de mon application Web sans les trucs .git.
Plain old bash fonctionne tout simplement :)
la source
.gitignore
, ce ne sera pas le cas.Aussi simple que cloner, supprimez le dossier .git:
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
la source
Pour les utilisateurs de GitHub, la
git archive --remote
méthode ne fonctionnera pas directement, car l'URL d'exportation est éphémère . Vous devez demander l'URL à GitHub, puis télécharger cette URL.curl
rend cela facile:Cela vous donnera le code exporté dans un répertoire local. Exemple:
Modifier
Si vous voulez que le code soit placé dans un répertoire spécifique existant (plutôt que dans le répertoire aléatoire de github):
la source
Oui, c'est une commande propre et soigné pour archiver votre code sans inclusion git dans l'archive et il est bon de passer autour sans se soucier de toute git commit histoire.
la source
Je veux juste souligner que dans le cas où vous êtes
Ensuite, vous pouvez simplement utiliser à la
cp foo [destination]
place de ce qui est mentionnégit-archive master foo | -x -C [destination]
.la source
Vous pouvez archiver un dépôt à distance à tout commit en tant que fichier zip.
la source
Bash-implémentation de git-export.
J'ai segmenté les processus de création et de suppression de fichiers .empty sur leur propre fonction, dans le but de les réutiliser dans l'implémentation de 'git-archive' (sera publié plus tard).
J'ai également ajouté le fichier «.gitattributes» au processus afin de supprimer les fichiers indésirables du dossier d'exportation cible. Inclus la verbosité du processus tout en rendant la fonction 'git-export' plus efficace.
EMPTY_FILE = ". Empty";
la source
Si vous voulez quelque chose qui fonctionne avec des sous-modules, cela pourrait valoir le coup.
Remarque:
Hypothèses:
la source
Ma préférence serait en fait d'avoir une cible dist dans votre Makefile (ou autre système de build) qui exporte une archive distribuable de votre code (.tar.bz2, .zip, .jar, ou tout ce qui est approprié). S'il vous arrive d'utiliser des outils automatiques GNU ou les systèmes MakeMaker de Perl, je pense que cela existe automatiquement pour vous. Sinon, je recommande fortement de l'ajouter.
ETA (2012-09-06): Wow, des downvotes sévères. Je pense toujours qu'il vaut mieux construire vos distributions avec vos outils de build plutôt qu'avec votre outil de contrôle de code source. Je crois en la construction d'artefacts avec des outils de construction. Dans mon travail actuel, notre produit principal est construit avec une cible de fourmi. Nous sommes en train de changer de système de contrôle de code source, et la présence de cette cible de fourmi signifie un tracas de migration en moins.
la source
Cela copiera les fichiers dans une plage de validations (C à G) dans un fichier tar. Remarque: cela ne fera que valider les fichiers. Pas l'intégralité du référentiel. Légèrement modifié d' ici
Exemple d'historique de validation
A -> B -> C -> D -> E -> F -> G -> H -> I
Page de manuel de git-diff-tree
-r -> recurse dans les sous-arbres
--no-commit-id -> git diff-tree affiche une ligne avec l'ID de validation le cas échéant. Cet indicateur a supprimé la sortie de l'ID de validation.
--name-only -> Afficher uniquement les noms des fichiers modifiés.
--diff-filter = ACMRT -> Sélectionnez uniquement ces fichiers. Voir ici pour la liste complète des fichiers
C..G -> Fichiers dans cette gamme de commits
C ~ -> Inclure les fichiers de Commit C. Pas seulement les fichiers depuis Commit C.
| xargs tar -rf myTarFile -> sorties vers tar
la source
Si je comprends bien la question, il s'agit davantage de télécharger uniquement un certain état du serveur, sans historique et sans données d'autres branches, plutôt que d'extraire un état d'un référentiel local (comme le font de nombreuses réponses ici).
Cela peut se faire comme ceci:
--single-branch
est disponible depuis Git 1.7.10 (avril 2012).--depth
est (était?) censément défectueux, mais dans le cas d'une exportation, les problèmes mentionnés ne devraient pas avoir d'importance.la source
--depth
, ce qui implique--single-branch
que sauf si--no-single-branch
est donné, ce qui signifie que cela a probablement le même effet. Pas sûr cependant, un expert peut confirmer?J'en avais besoin pour un script de déploiement et je ne pouvais utiliser aucune des approches mentionnées ci-dessus. Au lieu de cela, j'ai trouvé une solution différente:
la source
mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"
mais un peu plus long.En le faisant facilement, c'est une fonction pour .bash_profile, il décompresse directement l'archive sur l'emplacement actuel, configurez d'abord votre [url: chemin] habituel. REMARQUE: Avec cette fonction, vous évitez l'opération de clonage, elle provient directement du référentiel distant.
Alias pour .gitconfig, même configuration requise (PRENEZ SOIN d'exécuter la commande à l'intérieur des projets .git, il saute TOUJOURS au répertoire de base précédemment comme indiqué ici , jusqu'à ce que ce soit corrigé, je préfère personnellement la fonction
la source
De loin, la façon la plus simple que j'ai vue de le faire (et fonctionne également sur Windows) est
git bundle
:git bundle create /some/bundle/path.bundle --all
Voir cette réponse pour plus de détails: Comment puis-je copier mon référentiel git de ma machine Windows vers une machine Linux via un lecteur USB?
la source
git bundle
inclut le.git
dossier, ce que l'OP ne veut pas;git archive
semble la façon la plus appropriée--all
commutateur?J'ai une autre solution qui fonctionne bien si vous avez une copie locale du référentiel sur la machine où vous souhaitez créer l'exportation. Dans ce cas, accédez à ce répertoire de référentiel et entrez cette commande:
GIT_WORK_TREE=outputdirectory git checkout -f
Cela est particulièrement utile si vous gérez un site Web avec un référentiel git et souhaitez extraire une version propre dans
/var/www/
. Dans ce cas, ajoutez cette commande dans un.git/hooks/post-receive
script (hooks/post-receive
sur un référentiel nu, ce qui est plus approprié dans cette situation)la source
Je pense que le message de @Aredridel était le plus proche, mais il y a un peu plus - je vais donc ajouter ceci ici; la chose est, dans
svn
, si vous êtes dans un sous-dossier d'un repo, et vous faites:puis
svn
exportera tous les fichiers qui sont sous contrôle de révision (ils pourraient également avoir été récemment ajoutés; ou état modifié) - et si vous avez d'autres "ordures" dans ce répertoire (et je ne compte pas les.svn
sous-dossiers ici, mais des choses visibles comme des.o
fichiers) , il ne sera pas exporté; seuls les fichiers enregistrés par le dépôt SVN seront exportés. Pour moi, une bonne chose est que cette exportation inclut également des fichiers avec des modifications locales qui n'ont pas encore été validées; et une autre bonne chose est que les horodatages des fichiers exportés sont les mêmes que ceux d'origine. Ou, comme lesvn help export
dit:Pour réaliser que
git
cela ne préservera pas les horodatages, comparez la sortie de ces commandes (dans un sous-dossier d'ungit
dépôt de votre choix):... et:
... et je remarque en tout cas que
git archive
tous les horodatages du fichier archivé sont identiques!git help archive
dit:... mais apparemment les deux cas fixent le "temps de modification de chaque fichier"; donc pas préservant les horodatages réels de ces fichiers!
Donc, afin de préserver également les horodatages, voici un
bash
script, qui est en fait un "one-liner", quoique quelque peu compliqué - donc ci-dessous il est affiché sur plusieurs lignes:Notez que l'on suppose que vous exportez le contenu dans le répertoire "actuel" (ci-dessus,
/media/disk/git_svn/subdir
) - et que la destination dans laquelle vous exportez est quelque peu gênante, mais elle est dansDEST
la variable d'environnement. Notez qu'avec ce script; vous devez créer leDEST
répertoire manuellement vous-même, avant d'exécuter le script ci-dessus.Une fois le script exécuté, vous devriez pouvoir comparer:
... et j'espère voir les mêmes horodatages (pour les fichiers qui étaient sous contrôle de version).
J'espère que cela aide quelqu'un,
Cheers!
la source
une exportation git vers une archive zip tout en ajoutant un préfixe (par exemple le nom du répertoire):
la source
Si vous avez également besoin de sous-modules, cela devrait faire l'affaire: https://github.com/meitar/git-archive-all.sh/wiki
la source
j'ai la fonction utilitaire suivante dans mon fichier .bashrc: il crée une archive de la branche actuelle dans un référentiel git.
la source