2466 votes

Comment faire un "git à l'exportation" (comme "svn export")?

Je me demandais si il y a un bon "git à l'exportation" solution qui crée une copie d'un arbre sans l' .git répertoire de dépôt. Il existe au moins trois méthodes que je connais:

  1. git clone , suivie par la suppression de l' .git répertoire de dépôt.
  2. git checkout-index fait allusion à cette fonctionnalité, mais il commence avec "je Viens de lire le désiré de l'arbre dans l'index...", je ne suis pas entièrement sûr de savoir comment faire.
  3. git-export est un tiers script qui fait essentiellement une git clone dans un emplacement temporaire, suivie par rsync --exclude='.git' à la destination finale.

Aucune de ces solutions vraiment me frappe comme étant satisfaisante. Le plus proche de svn export pourrait être l'option 1, car à la fois ceux qui nécessitent le répertoire cible à vide en premier. Mais l'option 2 semble encore mieux, en supposant que je peux comprendre ce que cela signifie pour lire un arbre dans l'index.

2505voto

Charles Bailey Points 244082

Probablement la façon la plus simple d'y parvenir est avec git archive. Si vous avez vraiment besoin de tout l'étendu de l'arbre que vous pouvez faire quelque chose comme cela.

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

La plupart du temps dont j'ai besoin "d'exporter" quelque chose à partir de git, je veux une archive compressée en tout cas, si 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, il est tout à fait flexible.

334voto

Greg Hewgill Points 356191

J'ai trouvé l'option 2 moyens. À partir d'un référentiel, vous pouvez le faire:

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

La barre oblique à la fin du chemin d'accès est important, sinon il en résultera que les fichiers sont dans /de destination avec un préfixe de "chemin".

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

L' -a pavillon est tenu de vérifier tous les fichiers dans l'index (je ne suis pas sûr de ce que cela signifie de ne pas retenir cet indicateur dans cette situation, car il ne veut pas faire ce que je veux). L' -f drapeau des forces en remplaçant les fichiers existants dans la sortie, cette commande ne fonctionne pas normalement.

Cela semble être le genre de "git à l'exportation" je cherchais.

265voto

Aleksandr Somov Points 1700

git archive travaille également avec dépôt distant.

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

Pour exporter chemin d'accès particulier à l'intérieur de la repo ajouter autant de chemins que vous le souhaitez en dernier argument pour git, par exemple:

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

39voto

Daniel Schierbeck Points 962

J'ai écrit un simple wrapper autour de git-checkout-index que vous pouvez utiliser comme ceci:

git export ~/the/destination/dir

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

L'Installation est simple; il suffit de déposer le script quelque part dans votre PATH, et assurez-vous qu'il est exécutable.

Le dépôt github pour git-export

36voto

kostmo Points 2265

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X