Zrobić "git export" (jak "svn export")?

Zastanawiałem się, czy istnieje dobre rozwiązanie "git export", które tworzy kopię drzewa bez katalogu .git repozytorium. Istnieją co najmniej trzy metody, które znam:

  1. git clone a następnie usunięcie katalogu repozytorium .git.
  2. git checkout-index nawiązuje do tej funkcjonalności, ale zaczyna się od " wystarczy odczytać żądane drzewo do indeksu..."co nie jestem do końca pewien, jak to zrobić.
  3. git-export jest skryptem strony trzeciej, który zasadniczo wykonuje git clone do tymczasowego miejsca, a następnie rsync --exclude='.git' do ostatecznego miejsca przeznaczenia.
Żadne z tych rozwiązań nie wydaje mi się zadowalające. Najbliższa svn export może być opcja 1, ponieważ obie wymagają, aby katalog docelowy był pusty jako pierwszy. Ale opcja 2 wydaje się jeszcze lepsza, zakładając, że mogę dowiedzieć się, co to znaczy czytać drzewo w indeksie.
Author: Peter O., 2008-10-02

30 answers

Prawdopodobnie najprostszym sposobem, aby to osiągnąć jest z git archive. Jeśli naprawdę potrzebujesz tylko rozszerzonego drzewa, możesz zrobić coś takiego.

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

Przez większość czasu, kiedy muszę 'wyeksportować' coś z Gita, chcę skompresowanego archiwum, więc robię coś takiego.

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

Archiwum ZIP:

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

git help archive aby uzyskać więcej szczegółów, jest dość elastyczny.


Należy pamiętać, że nawet jeśli archiwum nie będzie zawierać .katalog git, it będzie jednak zawierać inne ukryte pliki specyficzne dla Gita, takie jak .gitignore,gitattributes, etc. Jeśli nie chcesz ich umieszczać w archiwum, upewnij się, że używasz atrybutu export-ignore w a .gitattributes file and commit this before doing your archive. Czytaj więcej...


Uwaga: jeśli jesteś zainteresowany eksportem indeksu, poleceniem jest

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

(Zobacz odpowiedź Grega Po Więcej Szczegółów)

 2216
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 10:10:20

Dowiedziałem się, co oznacza opcja 2. Z repozytorium można zrobić:

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

Ukośnik na końcu ścieżki jest ważny, w przeciwnym razie spowoduje, że pliki będą w / destination z prefiksem 'path'.

Ponieważ w normalnej sytuacji indeks zawiera zawartość repozytorium, nie ma nic specjalnego do zrobienia, aby "odczytać żądane drzewo do indeksu". Już tam jest.

Znacznik -a jest wymagany do sprawdzenia wszystkich plików w indeksie (Nie wiem co to znaczy pominąć tę flagę w tej sytuacji, ponieważ nie robi tego, co chcę). Znacznik -f wymusza nadpisanie wszystkich istniejących plików na wyjściu, czego normalnie nie robi to polecenie.

To wygląda na rodzaj "git export", którego szukałem.

 304
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-23 15:55:15

git archive działa również ze zdalnym repozytorium.

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

Aby wyeksportować konkretną ścieżkę wewnątrz repo Dodaj do git tyle ścieżek ile chcesz jako ostatni argument, np.:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
 242
Author: Aleksandr Somov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-23 19:01:01

Tutaj wpisz opis obrazka

Odpowiedź na specjalny przypadek, jeśli repozytorium jest hostowane na Githubie.

Po prostu użyj svn export.

Z tego co wiem Github nie pozwala archive --remote. Chociaż GitHub jest kompatybilny z svn i mają wszystkie repozytoria git svn dostępne, więc możesz po prostu użyć svn export, Jak zwykle z kilkoma poprawkami adresu URL Githuba.

Na przykład, aby wyeksportować całe repozytorium, zwróć uwagę, jak trunk w adresie URL zastępuje master (lub cokolwiek innego gałąź główna projektu jest ustawiona na):

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

I możesz wyeksportować pojedynczy plik lub nawet określoną ścieżkę lub folder:

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

Przykład z jquery JavaScript Library

The HEAD branch or master branch będzie dostępny za pomocą trunk:

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

The non-HEAD oddziały będą dostępne pod /branches/:

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

Wszystkie tagi pod /tags/ W ten sam sposób:

svn ls https://github.com/jquery/jquery/tags/2.1.3
 50
Author: Anthony Hatzopoulos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 15:13:04

From the Git Manual :

Użycie git-checkout-index do "Eksportuj całe drzewo"

Możliwość przedrostka sprawia, że używanie git-checkout-index jako funkcji "export as tree" jest banalne. Po prostu Wczytaj żądane drzewo do indeksu i wykonaj:

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

 38
Author: jperras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 02:27:07

Napisałem prosty wrapper git-checkout-index, którego możesz użyć Tak:

git export ~/the/destination/dir

Jeśli katalog docelowy już istnieje, musisz dodać -f lub --force.

Instalacja jest prosta; po prostu upuść skrypt gdzieś w swoim PATH i upewnij się, że jest wykonywalny.

Repozytorium github dla git-export

 37
Author: Daniel Schierbeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-16 17:17:00

Wygląda na to, że jest to mniej problem z Git niż SVN. Git stawia tylko a .folder git w katalogu głównym repozytorium, podczas gdy SVN umieszcza .folder svn w każdym podkatalogu. Tak więc "svn export" unika rekurencyjnej magii wiersza poleceń, podczas gdy w przypadku Gita rekurencja nie jest konieczna.

 35
Author: kostmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-12 04:20:24

Odpowiednik

svn export . otherpath

Wewnątrz istniejącego repo jest

git archive branchname | (cd otherpath; tar x)

Odpowiednik

svn export url otherpath

Jest

git archive --remote=url branchname | (cd otherpath; tar x)
 26
Author: aredridel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 15:41:55

Używam Git-submodules intensywnie. Ten mi działa:

rsync -a ./FROM/ ./TO --exclude='.*'
 21
Author: slatvick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-13 06:26:03

Jeśli nie wykluczasz plików z .gitattributes export-ignore Następnie spróbuj git checkout

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

-f
Podczas sprawdzania ścieżek z indeksu, nie zawiedź po niezaangażowaniu wpisy; zamiast tego niezerowane wpisy są ignorowane.

I

-q
Avoid verbose

Dodatkowo możesz uzyskać dowolną gałąź lub Tag lub z określonej rewizji Commit, jak w SVN po prostu dodając SHA1 (SHA1 w Git jest odpowiednikiem numeru rewizji w SVN)

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

/path/to/checkout/ musi być pusty, Git nie usunie żadnego pliku, ale nadpisze pliki o tej samej nazwie bez ostrzeżenia

UPDATE: Aby uniknąć problemu ścięcia głowy lub pozostawić nienaruszone działające repozytorium podczas korzystania z checkout do eksportu z tagami, gałęziami lub SHA1, musisz dodać -- ./ na końcu

Podwójny dash -- mówi gitowi, że wszystko po myślnikach to ścieżki lub pliki, a także w tym przypadku mówi git checkout, aby nie zmieniać HEAD

Przykłady:

To polecenie otrzyma tylko katalog libs, a także plik readme.txt z tego właśnie commita

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

Spowoduje to utworzenie(nadpisanie) my_file_2_behind_HEAD.txt dwóch commitów za głową 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

Aby uzyskać eksport innego oddziału

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

Zauważ, że {[16] } jest względem katalogu głównego repozytorium

 20
Author: user5286776117878,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 15:45:19

To skopiuje całą zawartość, minus .pliki dot. Używam tego do eksportowania projektów Git klonowane do mojej aplikacji internetowej Git repo bez .git stuff.

Cp-R ./path-to-Git-repo /path/to/destination/

Zwykły stary bash działa po prostu świetnie:)

 16
Author: Harmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-10 17:17:49

Często trafiałem na tę stronę, szukając sposobu na eksport repozytorium git. Moja odpowiedź na to pytanie dotyczy trzech właściwości, które svn export ma z założenia w porównaniu z Gitem, ponieważ svn działa w oparciu o scentralizowane repozytorium:

  • minimalizuje ruch do zdalnego repozytorium, nie eksportując wszystkich wersji
  • nie zawiera meta informacji w katalogu eksportu
  • Eksportowanie określonej gałęzi za pomocą svn odbywa się przez określenie odpowiedniej ścieżki

    git clone --depth 1 --branch master git://git.somewhere destination_path
    rm -rf destination_path/.git
    

Przy budowaniu pewnego wydania warto sklonować stabilną gałąź, jak na przykład --branch stable lub --branch release/0.9.

 16
Author: Lars Schillingmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 17:31:47

Tak proste jak klon, a następnie usuń .folder git:

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git

 11
Author: teleme.io,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 19:35:10

Chcę tylko zaznaczyć, że w przypadku, gdy jesteś

  1. eksportowanie podfolderu repozytorium (w ten sposób korzystałem z funkcji eksportu SVN)
  2. są w porządku z kopiowaniem wszystkiego z tego folderu do miejsca docelowego wdrożenia
  3. a ponieważ masz już kopię całego repozytorium.

Wtedy możesz po prostu użyć cp foo [destination] zamiast wspomnianego git-archive master foo | -x -C [destination].

 10
Author: dkinzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-29 13:51:08

Dla użytkowników GitHub, metoda git archive --remote nie będzie działać bezpośrednio, ponieważ adres URL eksportu jest efemeryczny . Musisz poprosić GitHub o adres URL, a następnie pobrać ten adres URL. curl ułatwia:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

To da ci wyeksportowany kod w lokalnym katalogu. Przykład:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

Edit
Jeśli chcesz umieścić kod w konkretnym, istniejącym katalogu (zamiast losowego z github):

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1
 10
Author: bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 13:24:42

Możesz zarchiwizować zdalne repo w dowolnym commicie jako plik zip.

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT
 9
Author: orkoden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 13:49:55

Tak, to jest czystym i schludnym poleceniem do archiwizacji Twojego kodu bez włączania git do archiwum i jest dobre do przekazania bez martwienia się o historię zatwierdzeń git.

git archive --format zip --output /full/path/to/zipfile.zip master 
 9
Author: zeeawan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:34

Bash-implementacja git-export.

Podzieliłem ... procesy tworzenia i usuwania pustych plików we własnej funkcji, w celu ich ponownego wykorzystania w implementacji 'Git-archive' (zostaną opublikowane później).

Dodałem również '.gitatt przypisuje plik do procesu w celu usunięcia nie poszukiwanych plików z docelowego folderu eksportu. Dodano szczegółowość procesu, czyniąc funkcję' Git-export ' bardziej wydajny.

EMPTY_FILE=".empty";

function create_empty () {
## Processing path (target-dir):
    TRG_PATH="${1}";
## Component(s):
    EXCLUDE_DIR=".git";
echo -en "\nAdding '${EMPTY_FILE}' files to empty folder(s): ...";
    find ${TRG_PATH} -not -path "*/${EXCLUDE_DIR}/*" -type d -empty -exec touch {}/${EMPTY_FILE} \;
#echo "done.";
## Purging SRC/TRG_DIRs variable(s):
    unset TRG_PATH EMPTY_FILE EXCLUDE_DIR;
    return 0;
  }

declare -a GIT_EXCLUDE;
function load_exclude () {
    SRC_PATH="${1}";
    ITEMS=0; while read LINE; do
#      echo -e "Line [${ITEMS}]: '${LINE%%\ *}'";
      GIT_EXCLUDE[((ITEMS++))]=${LINE%%\ *};
    done < ${SRC_PATH}/.gitattributes;
    GIT_EXCLUDE[${ITEMS}]="${EMPTY_FILE}";
## Purging variable(s):
    unset SRC_PATH ITEMS;
    return 0;
  }

function purge_empty () {
## Processing path (Source/Target-dir):
    SRC_PATH="${1}";
    TRG_PATH="${2}";
echo -e "\nPurging Git-Specific component(s): ... ";
    find ${SRC_PATH} -type f -name ${EMPTY_FILE} -exec /bin/rm '{}' \;
    for xRULE in ${GIT_EXCLUDE[@]}; do
echo -en "    '${TRG_PATH}/{${xRULE}}' files ... ";
      find ${TRG_PATH} -type f -name "${xRULE}" -exec /bin/rm -rf '{}' \;
echo "done.'";
    done;
echo -e "done.\n"
## Purging SRC/TRG_PATHs variable(s):
    unset SRC_PATH; unset TRG_PATH;
    return 0;
  }

function git-export () {
    TRG_DIR="${1}"; SRC_DIR="${2}";
    if [ -z "${SRC_DIR}" ]; then SRC_DIR="${PWD}"; fi
    load_exclude "${SRC_DIR}";
## Dynamically added '.empty' files to the Git-Structure:
    create_empty "${SRC_DIR}";
    GIT_COMMIT="Including '${EMPTY_FILE}' files into Git-Index container."; #echo -e "\n${GIT_COMMIT}";
    git add .; git commit --quiet --all --verbose --message "${GIT_COMMIT}";
    if [ "${?}" -eq 0 ]; then echo " done."; fi
    /bin/rm -rf ${TRG_DIR} && mkdir -p "${TRG_DIR}";
echo -en "\nChecking-Out Index component(s): ... ";
    git checkout-index --prefix=${TRG_DIR}/ -q -f -a
## Reset: --mixed = reset HEAD and index:
    if [ "${?}" -eq 0 ]; then
echo "done."; echo -en "Resetting HEAD and Index: ... ";
        git reset --soft HEAD^;
        if [ "${?}" -eq 0 ]; then
echo "done.";
## Purging Git-specific components and '.empty' files from Target-Dir:
            purge_empty "${SRC_DIR}" "${TRG_DIR}"
          else echo "failed.";
        fi
## Archiving exported-content:
echo -en "Archiving Checked-Out component(s): ... ";
        if [ -f "${TRG_DIR}.tgz" ]; then /bin/rm ${TRG_DIR}.tgz; fi
        cd ${TRG_DIR} && tar -czf ${TRG_DIR}.tgz ./; cd ${SRC_DIR}
echo "done.";
## Listing *.tgz file attributes:
## Warning: Un-TAR this file to a specific directory:
        ls -al ${TRG_DIR}.tgz
      else echo "failed.";
    fi
## Purgin all references to Un-Staged File(s):
   git reset HEAD;
## Purging SRC/TRG_DIRs variable(s):
    unset SRC_DIR; unset TRG_DIR;
    echo "";
    return 0;
  }

Wyjście:

$ git-export /tmp/rel-1.0.0

Dodawanie".empty ' pliki do pustych folderów: ... załatwione.

Sprawdzanie składowych indeksu (- ów): ... załatwione.

Resetowanie głowicy i indeksu: ... załatwione.

Czyszczenie specyficznych dla Gita komponentów: ...

' / tmp / rel-1.0.0 / {.buildpath}' pliki ... załatwione.'

' / tmp / rel-1.0.0 / {./ align = "left" / .. załatwione.'

' / tmp / rel-1.0.0 / {./ align = "left" / .. załatwione.'

' / tmp / rel-1.0.0 / {./ align = "left" / .. załatwione.'

' / tmp / rel-1.0.0 / {.gitattributes} ' pliki... załatwione.'

' / tmp / rel-1.0.0 / { * ./ align = "left" / .. załatwione.'

'/tmp/rel-1.0.0/{*~}' pliki ... załatwione.'

' / tmp / rel-1.0.0 / {./ align = "left" / .. załatwione.'

' / tmp / rel-1.0.0 / { * .pliki swp ... załatwione.'

' / tmp / rel-1.0.0 / { * .pliki swo ... załatwione.'

' / tmp / rel-1.0.0 / {.DS_Store}" pliki ... załatwione.'

' / tmp / rel-1.0.0 / {.ustawienia} ' pliki... załatwione.'

' / tmp / rel-1.0.0 / {.puste} ' pliki ... załatwione.'

Zrobione.

Archiwizacja danych: ... załatwione.

-RW-R--R-- 1 Admin wheel 25445901 3 lis 12: 57/tmp / rel-1.0.0.tgz

Włączyłem teraz funkcjonalność 'Git archive' do jednego procesu, który korzysta z funkcji 'create_empty' i innych funkcji.

function git-archive () {
    PREFIX="${1}"; ## sudo mkdir -p ${PREFIX}
    REPO_PATH="`echo "${2}"|awk -F: '{print $1}'`";
    RELEASE="`echo "${2}"|awk -F: '{print $2}'`";
    USER_PATH="${PWD}";
echo "$PREFIX $REPO_PATH $RELEASE $USER_PATH";
## Dynamically added '.empty' files to the Git-Structure:
    cd "${REPO_PATH}"; populate_empty .; echo -en "\n";
#    git archive --prefix=git-1.4.0/ -o git-1.4.0.tar.gz v1.4.0
# e.g.: git-archive /var/www/htdocs /repos/domain.name/website:rel-1.0.0 --explode
    OUTPUT_FILE="${USER_PATH}/${RELEASE}.tar.gz";
    git archive --verbose --prefix=${PREFIX}/ -o ${OUTPUT_FILE} ${RELEASE}
    cd "${USER_PATH}";
    if [[ "${3}" =~ [--explode] ]]; then
      if [ -d "./${RELEASE}" ]; then /bin/rm -rf "./${RELEASE}"; fi
      mkdir -p ./${RELEASE}; tar -xzf "${OUTPUT_FILE}" -C ./${RELEASE}
    fi
## Purging SRC/TRG_DIRs variable(s):
    unset PREFIX REPO_PATH RELEASE USER_PATH OUTPUT_FILE;
    return 0;
  }
 8
Author: tocororo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-04 04:34:30

Jeśli chcesz coś, co działa z modułami podrzędnymi, może to być warte wypróbowania.

Uwaga:

  • MASTER_DIR = a checkout with your submodules checkOut also
  • DEST_DIR = gdzie skończy się ten eksport
  • Jeśli masz rsync, myślę, że będziesz w stanie zrobić to samo z jeszcze mniejszym bólem piłki.

Założenia:

  • musisz to uruchomić z katalogu nadrzędnego MASTER_DIR (tzn. z płyty MASTER_DIR.. )
  • zakłada się DEST_DIR zostać stworzonym. Jest to dość łatwe do modyfikacji, aby uwzględnić utworzenie DEST_DIR, jeśli chcesz

Cd MASTER_DIR & & tar-zcvf ../ DEST_DIR / export.smoła.gz --exclude='.git*" . && Cd../ DEST_DIR / & & tar xvfz export.smoła.gz & & RM export.smoła.gz

 8
Author: Rob Jensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 01:42:28

Spowoduje skopiowanie plików w zakresie zatwierdzeń (od C do G) do pliku tar. Uwaga: spowoduje to tylko pobranie plików. Nie całe repozytorium. Nieco zmodyfikowany z Tutaj

Przykładowa Historia Zatwierdzania

A -- > B -- > C -- > D -- > E -- > F -- > G -- > H -- > I

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

Strona podręcznika Git-diff-tree

-r -- > recurse into sub-trees

--no-commit-id -- > git diff-tree wyświetla linię z identyfikatorem commit, jeśli ma to zastosowanie. Ta flaga wyłączono wyjście ID zatwierdzenia.

--name-only -- > pokazuje tylko nazwy zmienionych plików.

--diff-filter=ACMRT -- > wybierz tylko te pliki. zobacz tutaj pełną listę plików

C..G -- > pliki w tym zakresie commitów

C ~ -- > Dołącz pliki z Commit C. nie tylko pliki od Commit C.

/ xargs tar-RF myTarFile --> wyjścia do tar

 6
Author: Fuyu Persimmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:27

Moją preferencją byłoby posiadanie Dist w pliku Makefile (lub innym systemie budowania), który eksportuje dystrybuowalne archiwum Twojego kodu (.tar.bz2,.zip,słoik, czy cokolwiek jest właściwe). Jeśli przypadkiem używasz Autotools GNU lub systemów Makemaker Perla, myślę, że istnieje to dla ciebie automatycznie. Jeśli nie, Gorąco polecam dodanie go.

ETA (2012-09-06): Wow, ostre dowcipy. Nadal uważam, że lepiej jest budować swoje dystrybucje za pomocą narzędzi do budowania zamiast narzędzia kontroli kodu źródłowego. Wierzę w budowanie artefaktów za pomocą narzędzi budowlanych. W mojej obecnej pracy, nasz główny produkt jest zbudowany z celu mrówki. Jesteśmy w trakcie przełączania systemów kontroli kodu źródłowego, a obecność tego celu ant oznacza jeden mniej kłopotów w migracji.

 5
Author: skiphoppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 13:54:17

Potrzebowałem tego do skryptu deploy i nie mogłem użyć żadnego z wyżej wymienionych podejść. Zamiast tego wymyśliłem inne rozwiązanie:

#!/bin/sh
[ $# -eq 2 ] || echo "USAGE $0 REPOSITORY DESTINATION" && exit 1
REPOSITORY=$1
DESTINATION=$2
TMPNAME="/tmp/$(basename $REPOSITORY).$$"
git clone $REPOSITORY $TMPNAME
rm -rf $TMPNAME/.git
mkdir -p $DESTINATION
cp -r $TMPNAME/* $DESTINATION
rm -rf $TMPNAME
 4
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-17 10:07:43

Robiąc to w prosty sposób, jest to funkcja dla .bash_profile, bezpośrednio rozpakowuje archiwum w bieżącej lokalizacji, najpierw skonfiguruj swój zwykły [url:path]. Uwaga: dzięki tej funkcji unikasz operacji klonowania, dostaje się bezpośrednio ze zdalnego repo.

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

Alias dla .gitconfig, ta sama konfiguracja wymagana (dbaj o wykonanie polecenia w środku .projekty git, zawsze przeskakuje do bazowego katalogu poprzednio Jak tu pisałem , dopóki to nie zostanie naprawione osobiście wolę function

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -
 4
Author: RkG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-19 16:32:28

Myślę, że @Aredridel 's post był najbliżej, ale jest trochę więcej do tego - więc dodam to tutaj; rzecz w tym, że w svn, jeśli jesteś w podfolderze repo, i robisz:

/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir

Wtedy svn wyeksportuje wszystkie pliki, które są pod kontrolą wersji (mogły być również świeżo dodane lub zmodyfikowane) - i jeśli masz inne "śmieci" w tym katalogu ( i nie liczę podfolderów .svn, ale widoczne rzeczy, takie jak .o Pliki), to Nie będą eksportowane; tylko te pliki zarejestrowane przez repo SVN będą eksportowane. Dla mnie jedną miłą rzeczą jest to, że ten eksport zawiera również pliki z lokalnymi zmianami, które nie zostały jeszcze zatwierdzone; a kolejną miłą rzeczą jest to, że znaczniki czasu wyeksportowanych plików są takie same jak oryginalne. Albo, jak to ujął svn help export:

  1. eksportuje czyste drzewo katalogów z kopii roboczej określonej przez PATH1, przy rewizji REV, jeśli jest podana, w przeciwnym razie przy pracy, do PATH2. ... Jeżeli REV Nie podano, wszystkie lokalne zmiany zostaną zachowane. Pliki nie pod kontrolą wersji będą nie być kopiowane.
Aby zrozumieć, że git nie zachowa znaczników czasu, porównaj wyjście tych poleceń (w podfolderze git repo do wyboru):
/media/disk/git_svn/subdir$ ls -la .

... oraz:

/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)

... i w każdym razie zauważam, że git archive powoduje, że wszystkie znaczniki czasu zarchiwizowanego pliku są takie same! git help archive says:

Git archiwum zachowuje się inaczej, gdy podano identyfikator drzewa, niż gdy podano identyfikator zatwierdzenia lub znacznika. W pierwszym przypadku czas bieżący jest używany jako czas modyfikacji KAŻDEGO pliku w archiwum. W tym drugim przypadku czas zatwierdzenia zapisany w odwołanym commit obiekt jest używany zamiast.

... ale najwyraźniej oba przypadki ustawiają " czas modyfikacji KAŻDEGO pliku "; tym samym Nie zachowując rzeczywiste znaczniki czasu tych plików!

Tak więc, aby również zachować w 1999 roku, w wyniku połączenia się z firmą, w 1999 roku, firma została założona przez firmę, która w 1999 roku została założona przez firmę, a w 1999 roku została założona przez firmę.]}

/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
  DEST="/media/diskC/tmp/subdirB"; \
  CWD="$PWD"; \
  while read line; do \
    DN=$(dirname "$line"); BN=$(basename "$line"); \
    SRD="$CWD"; TGD="$DEST"; \
    if [ "$DN" != "." ]; then \
      SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
      if [ ! -d "$TGD" ] ; then \
        CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
        echo "$CMD"; \
        eval "$CMD"; \
      fi; \
    fi; \
    CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
    echo "$CMD"; \
    eval "$CMD"; \
    done \
)

Zauważ, że zakłada się, że eksportujesz zawartość w katalogu" current " (powyżej, /media/disk/git_svn/subdir) - a miejsce docelowe, do którego eksportujesz, jest nieco niewygodnie umieszczone, ale znajduje się w zmiennej środowiskowej DEST. Zauważ, że za pomocą tego skryptu musisz utworzyć katalog DEST ręcznie, przed uruchomieniem powyższego skryptu.

Po uruchomieniu skryptu powinieneś być w stanie porównać:

ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB   # DEST

... i mam nadzieję, że zobaczą te same znaczniki czasu (dla tych plików, które były pod kontrolą wersji).

Mam nadzieję, że to komuś pomoże,
Zdrowie!

 3
Author: sdaau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:27

Zdecydowanie najprostszym sposobem, jaki widziałem, aby to zrobić (i działa również na windows) jest git bundle:

git bundle create /some/bundle/path.bundle --all

Zobacz tę odpowiedź po więcej szczegółów: Jak mogę skopiować moje repozytorium git z komputera z systemem windows na komputer z Linuksem za pomocą dysku usb?

 3
Author: B T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:53

Jeśli potrzebujesz również podmodułów, powinno to załatwić sprawę: https://github.com/meitar/git-archive-all.sh/wiki

 2
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-23 15:05:20

Jak rozumiem pytanie, chodzi raczej o pobieranie tylko pewnego stanu z serwera, bez historii i bez danych z innych gałęzi, a nie wyciąganie stanu z lokalnego repozytorium(jak wiele anwserów tutaj robi).

To można zrobić tak:

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/
  • --single-branch jest dostępny od wersji Git 1.7.10 (kwiecień 2012).
  • --depth is (was?) podobno wadliwe, ale w przypadku eksportu wymienione kwestie nie powinny mieć znaczenia.
 2
Author: Ondra Žižka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 14:59:27

Mam następujące funkcje użytkowe w moim .plik bashrc: tworzy archiwum bieżącej gałęzi w repozytorium git.

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}
 1
Author: MichaelMoser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 07:38:31

Opcja 1 brzmi niezbyt wydajnie. Co jeśli w kliencie nie ma miejsca na klonowanie i , a następnie usunięcie folderu .git?

Dzisiaj znalazłem się próbuje to zrobić, gdzie klient jest Raspberry Pi prawie nie ma miejsca w lewo. Co więcej, chcę również wykluczyć jakiś ciężki folder z repozytorium.

Opcja 2 i inne odpowiedzi tutaj nie pomagają w tym scenariuszu. Ani git archive (ponieważ wymaga zatwierdzenia pliku .gitattributes, a ja nie chcę tego zapisać wykluczenie w repozytorium).

Tutaj dzielę się moim rozwiązaniem, podobnym do opcji 3, ale bez potrzeby git clone:

tmp=`mktemp`
git ls-tree --name-only -r HEAD > $tmp
rsync -avz --files-from=$tmp --exclude='fonts/*' . raspberry:

Zmiana linii rsync na równoważną linię dla compressa będzie również działać jako git archive, ale z opcją wykluczania (tak jak jest to wymagane tutaj).

 1
Author: alexis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 19:35:11

Mam inne rozwiązanie, które działa dobrze, jeśli masz lokalną kopię repozytorium na komputerze, na którym chcesz utworzyć eksport. W tym przypadku przejdź do tego katalogu repozytorium i wprowadź następujące polecenie:

GIT_WORK_TREE=outputdirectory git checkout -f

Jest to szczególnie przydatne, jeśli zarządzasz stroną internetową z repozytorium git i chcesz zamówić czystą wersję w /var/www/. W tym przypadku dodaj thiscommand w skrypcie .git/hooks/post-receive (hooks/post-receive na gołym repozytorium, co jest bardziej odpowiednie w tym situation)

 1
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 10:30:17