Вопрос:

Сделайте «git export» (например, «svn export»)?

git export git-archive svn-export

563187 просмотра

30 ответа

652803 Репутация автора

Мне было интересно, есть ли хорошее решение «git export», которое создает копию дерева без .gitкаталога репозитория. Есть, по крайней мере, три метода, о которых я знаю:

  1. git cloneпосле чего .gitудаляется каталог репозитория.
  2. git checkout-index ссылается на эту функциональность, но начинается с «Просто прочитайте нужное дерево в индекс ...», которое я не совсем уверен, как это сделать.
  3. git-exportэто сторонний скрипт, который по сути делает git cloneвременное местоположение, за которым следует rsync --exclude='.git'конечный пункт назначения.

Ни одно из этих решений на самом деле не показалось мне удовлетворительным. Ближайшим svn exportвариантом может быть вариант 1, потому что оба из них требуют, чтобы целевой каталог был пустым первым. Но вариант 2 кажется еще лучше, предполагая, что я могу понять, что значит читать дерево в индексе.

Автор: Greg Hewgill Источник Размещён: 02.10.2008 02:21

Ответы (30)


38 плюса

519 Репутация автора

Из руководства Git :

Использование git-checkout-index для «экспорта всего дерева»

Префиксная способность в основном делает тривиальным использование git-checkout-index в качестве функции «экспорт как дерево». Просто прочитайте нужное дерево в индексе и выполните:

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

Автор: jperras Размещён: 02.10.2008 02:27

307 плюса

652813 Репутация автора

Я узнал, что означает вариант 2. Из репозитория вы можете:

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

Слэш в конце пути важен, иначе это приведет к тому, что файлы находятся в / destination с префиксом «путь».

Поскольку в нормальной ситуации индекс содержит содержимое репозитория, нет ничего особенного в том, чтобы «читать нужное дерево в индекс». Это уже есть.

-aФлаг требуется , чтобы проверить все файлы в индексе (я не уверен , что это значит пропустить этот флаг в этой ситуации, так как он не делает то , что я хочу). В -fфлаг силы перезаписи существующих файлов на выходе, что эта команда обычно не делают.

Кажется, это своего рода «git export», который я искал.

Автор: Greg Hewgill Размещён: 02.10.2008 03:03

5 плюса

35644 Репутация автора

My preference would actually be to have a dist target in your Makefile (or other build system) that exports a distributable archive of your code (.tar.bz2, .zip, .jar, or whatever is appropriate). If you happen to be using GNU autotools or Perl's MakeMaker systems, I think this exists for you automatically. If not, I highly recommend adding it.

ETA (2012-09-06): Wow, harsh downvotes. I still believe it is better to build your distributions with your build tools rather than your source code control tool. I believe in building artifacts with build tools. In my current job, our main product is built with an ant target. We are in the midst of switching source code control systems, and the presence of this ant target means one less hassle in migration.

Автор: skiphoppy Размещён: 02.10.2008 03:13

2235 плюса

499412 Репутация автора

Решение

Вероятно, самый простой способ добиться этого - с git archive. Если вам действительно нужно только расширенное дерево, вы можете сделать что-то подобное.

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

В большинстве случаев, когда мне нужно «экспортировать» что-то из git, я хочу, чтобы в любом случае был сжатый архив, поэтому я делаю что-то вроде этого.

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

Почтовый архив:

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

git help archive для более подробной информации, это довольно гибко.


Имейте в виду, что, несмотря на то, что архив не будет содержать каталог .git, он, однако, будет содержать другие скрытые git-определенные файлы, такие как .gitignore, .gitattributes и т. Д. Если вы не хотите их в архиве, убедитесь, что вы используйте атрибут export-ignore в файле .gitattributes и зафиксируйте это, прежде чем делать свой архив. Прочитайте больше...


Примечание. Если вы хотите экспортировать индекс, команда

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

(См . Ответ Грега для более подробной информации)

Автор: CB Bailey Размещён: 02.10.2008 06:13

38 плюса

1269 Репутация автора

Я написал простую оболочку, git-checkout-indexкоторую вы можете использовать следующим образом:

git export ~/the/destination/dir

Если каталог назначения уже существует, вам нужно добавить -fили --force.

Установка проста; просто отпустите скрипт где-нибудь в своем PATHи убедитесь, что он выполним.

Репозиторий github для git-export

Автор: Daniel Schierbeck Размещён: 16.10.2008 05:17

244 плюса

2548 Репутация автора

git archive также работает с удаленным репозиторием.

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

Чтобы экспортировать определенный путь внутри репо, добавьте столько путей, сколько хотите, в качестве последнего аргумента для git, например:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
Автор: Aleksandr Somov Размещён: 09.12.2008 06:59

35 плюса

4390 Репутация автора

Похоже, что это не проблема с Git, чем SVN. Git только помещает папку .git в корне репозитория, тогда как SVN помещает папку .svn в каждый подкаталог. Таким образом, «svn export» избегает рекурсивной магии командной строки, тогда как с репликацией Git не требуется.

Автор: kostmo Размещён: 12.05.2009 04:20

4 плюса

88399 Репутация автора

I needed this for a deploy script and I couldn't use any of the above mentioned approaches. Instead I figured out a different solution:

#!/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
Автор: troelskn Размещён: 17.07.2009 10:07

4 плюса

49 Репутация автора

Doing it the easy way, this is a function for .bash_profile, it directly unzips the archive on current location, configure first your usual [url:path]. NOTE: With this function you avoid the clone operation, it gets directly from the remote 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 for .gitconfig, same configuration required (TAKE CARE executing the command inside .git projects, it ALWAYS jumps to the base dir previously as said here, until this is fixed I personally prefer the 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' -
Автор: RkG Размещён: 19.03.2010 04:12

10 плюса

19588 Репутация автора

Я просто хочу указать, что в том случае, если вы

  1. экспорт подпапки в репозитории (так я использовал функцию экспорта SVN)
  2. в порядке, копируя все из этой папки в место развертывания
  3. и поскольку у вас уже есть копия всего хранилища.

Тогда вы можете просто использовать cp foo [destination]вместо упомянутого git-archive master foo | -x -C [destination].

Автор: dkinzer Размещён: 29.10.2010 01:51

16 плюса

1773 Репутация автора

Это скопирует все содержимое, за исключением файлов .dot. Я использую это, чтобы экспортировать git-клонированные проекты в git-репо моего веб-приложения без материала .git.

cp -R ./path-to-git-repo / path / to / destination /

Простой старый баш работает просто отлично :)

Автор: Harmon Размещён: 10.12.2010 05:17

21 плюса

1075 Репутация автора

Я широко использую git-подмодули. Это работает для меня:

rsync -a ./FROM/ ./TO --exclude='.*'
Автор: slatvick Размещён: 13.09.2011 06:26

8 плюса

61 Репутация автора

Bash-реализация git-экспорта.

Я сегментировал процессы создания и удаления файлов с их помощью, с целью повторного использования их в реализации «git-archive» (будет опубликован позже).

Я также добавил файл «.gitattributes» в этот процесс, чтобы удалить ненужные файлы из целевой папки экспорта. Добавлена ​​многословия к процессу, делая функцию «git-export» более эффективной.

"Пустой" empty_file =;

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;
  }

Выход:

$ git-export /tmp/rel-1.0.0

Добавление «.пустых» файлов в пустые папки: ... done.

Индексный компонент (ы) индексирования: ... сделано.

Сброс HEAD и Index: ... сделано.

Очистка Git-специфических компонентов: ...

'/tmp/rel-1.0.0/{.buildpath}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.project}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.gitignore}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.git}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.gitattributes}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{*.mno}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{*~}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.*~}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{*.swp}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{*.swo}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.DS_Store}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.settings}' файлы ... сделаны. '

'/tmp/rel-1.0.0/{.empty}' файлы ... сделаны. '

сделанный.

Архивирование Выбранный компонент (ы): ... сделано.

-rw-r - r-- 1 admin wheel 25445901 3 ноя 12:57 /tmp/rel-1.0.0.tgz

Теперь я включил функциональность «git archive» в один процесс, который использует функцию «create_empty» и другие функции.

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;
  }
Автор: tocororo Размещён: 01.11.2011 06:27

17 плюса

1108 Репутация автора

Я часто сталкивался с этой страницей при поиске способа экспорта репозитория git. Мой ответ на этот вопрос рассматривает три свойства, которые svn-экспорт имеет по дизайну по сравнению с git, поскольку svn следует централизованному методу репозитория:

  • Он сводит к минимуму трафик в удаленном местоположении репозитория, не экспортируя все изменения
  • Он не включает метаинформацию в каталоге экспорта
  • Экспорт определенной ветки с использованием svn осуществляется путем указания соответствующего пути

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

При создании определенного выпуска полезно клонировать стабильную ветвь, например, --branch stableили --branch release/0.9.

Автор: Lars Schillingmann Размещён: 22.01.2012 05:31

26 плюса

1380 Репутация автора

Эквивалент

svn export . otherpath

внутри существующего репо

git archive branchname | (cd otherpath; tar x)

Эквивалент

svn export url otherpath

является

git archive --remote=url branchname | (cd otherpath; tar x)
Автор: aredridel Размещён: 23.02.2012 03:41

8 плюса

81 Репутация автора

Если вы хотите что-то, что работает с подмодулями, это может стоить того.

Замечания:

  • MASTER_DIR = выписка с вашими подмодулями
  • DEST_DIR = где этот экспорт будет
  • Если у вас rsync, я думаю, вы сможете сделать то же самое с еще меньшей болью в балу.

Предположения:

  • Вам нужно запустить это из родительского каталога MASTER_DIR (т. Е. Из MASTER_DIR cd ..)
  • Предполагается, что DEST_DIR был создан. Это довольно легко изменить, чтобы включить создание DEST_DIR, если вы хотите

cd MASTER_DIR && tar -zcvf ../DEST_DIR/export.tar.gz --exclude='.git*' . && cd ../DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz

Автор: Rob Jensen Размещён: 28.02.2012 01:42

2 плюса

933 Репутация автора

Если вам нужны подмодули, это должно сделать трюк: https://github.com/meitar/git-archive-all.sh/wiki

Автор: Brandon Размещён: 23.08.2012 03:05

9 плюса

12313 Репутация автора

Вы можете архивировать удаленное репо при любом фиксации в виде zip-файла.

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT
Автор: orkoden Размещён: 09.10.2012 01:49

11 плюса

499 Репутация автора

Так же просто, как клонировать, удалите папку .git:

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

Автор: teleme.io Размещён: 27.09.2013 07:35

51 плюса

8626 Репутация автора

введите описание изображения здесь

Ответ на специальный случай, если хранилище размещено в GitHub.

Просто используйте svn export.

Насколько мне известно, Гитуб не позволяет archive --remote. Хотя GitHub совместим с svn, и у них есть все svnдоступные репозитории git, поэтому вы можете просто использовать, svn exportкак обычно, с помощью нескольких настроек вашего URL-адреса GitHub.

Например, чтобы экспортировать весь репозиторий, обратите внимание, как trunkв URL-адресе заменяется master(или независимо от того, в какой ветке HEAD проекта указано значение ):

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

И вы можете экспортировать один файл или даже определенный путь или папку:

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

Пример с jQuery JavaScript Library

HEADФилиал или мастер филиал будет доступен по trunk:

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

Не HEAD филиалы будут доступны /branches/:

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

Все теги под /tags/таким же образом:

svn ls https://github.com/jquery/jquery/tags/2.1.3
Автор: Anthony Hatzopoulos Размещён: 30.10.2013 05:03

20 плюса

11 Репутация автора

Если вы не исключаете файлы, а .gitattributes export-ignoreзатем попробуйтеgit checkout

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

-f
При проверке путей из индекса не прерываться при несанкционированных вводах; вместо этого игнорируемые записи игнорируются.

а также

-q
Избегайте подробных

Кроме того, вы можете получить любой филиал или тег или из определенного Commit Revision, например, в SVN, просто добавив SHA1 (SHA1 в Git эквивалентен номеру пересмотра в SVN)

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

/path/to/checkout/Должен быть пустым, Git не будет удалять любой файл, но перезаписывает файлы с таким же именем без какого - либо предупреждения

ОБНОВЛЕНИЕ. Чтобы избежать проблемы с обезглавленными или оставить неповрежденным рабочий репозиторий при использовании проверки экспорта с тегами, ветвями или SHA1, вам нужно добавить -- ./в конце

Двойная тире --говорит git, что все после тире - это пути или файлы, а также в этом случае говорит, git checkoutчто не изменятьHEAD

Примеры:

Эта команда получит только каталог libs, а также readme.txtфайл, который точно фиксирует

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

Это создаст (перезапишет) my_file_2_behind_HEAD.txtдве коммиты за головой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

Чтобы получить экспорт другой ветки

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

Обратите внимание, что ./это относительно корня репозитория

Автор: user5286776117878 Размещён: 28.03.2014 01:39

6 плюса

346 Репутация автора

This will copy the files in a range of commits (C to G) to a tar file. Note: this will only get the files commited. Not the entire repository. Slightly modified from Here

Example Commit History

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

git-diff-tree Manual Page

-r --> recurse into sub-trees

--no-commit-id --> git diff-tree outputs a line with the commit ID when applicable. This flag suppressed the commit ID output.

--name-only --> Show only names of changed files.

--diff-filter=ACMRT --> Select only these files. See here for full list of files

C..G --> Files in this range of commits

C~ --> Include files from Commit C. Not just files since Commit C.

| xargs tar -rf myTarFile --> outputs to tar

Автор: Fuyu Persimmon Размещён: 25.04.2014 05:47

1 плюс

1618 Репутация автора

У меня есть следующая функция утилиты в моем файле .bashrc: он создает архив текущей ветви в репозитории 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
}
Автор: MichaelMoser Размещён: 22.05.2014 07:38

3 плюса

19160 Репутация автора

I think @Aredridel's post was closest, but there's a bit more to that - so I will add this here; the thing is, in svn, if you're in a subfolder of a repo, and you do:

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

then svn will export all files that are under revision control (they could have also freshly Added; or Modified status) - and if you have other "junk" in that directory (and I'm not counting .svn subfolders here, but visible stuff like .o files), it will not be exported; only those files registered by the SVN repo will be exported. For me, one nice thing is that this export also includes files with local changes that have not been committed yet; and another nice thing is that the timestamps of the exported files are the same as the original ones. Or, as svn help export puts it:

  1. Экспортирует чистое дерево каталогов из рабочей копии, указанной PATH1, при пересмотре REV, если оно указано, иначе на РАБОТЕ, в PATH2. ... Если REV не указан, все локальные изменения будут сохранены. Файлы, не находящиеся под управлением версиями, не будут скопированы.

Чтобы понять, что gitне сохранит отметки времени, сравните выходные данные этих команд (в подпапке gitрепо по вашему выбору):

/media/disk/git_svn/subdir$ ls -la .

... а также:

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

... и я, во всяком случае, заметил, что git archiveвсе временные метки архивного файла одинаковы! git help archiveговорит:

git-архив ведет себя по-разному при задании идентификатора дерева по сравнению с датой идентификатора фиксации или идентификатора тега. В первом случае текущее время используется как время модификации каждого файла в архиве. В последнем случае вместо этого используется время фиксации, записанное в ссылочном объекте commit.

... но, очевидно, оба случая устанавливают «время модификации каждого файла»; тем самым не сохраняя фактических временных меток этих файлов!

Таким образом, чтобы сохранить временные метки, вот bashсценарий, который на самом деле является «одним лайнером», хотя и несколько сложным, поэтому ниже он размещен в нескольких строках:

/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 \
)

Обратите внимание, что предполагается, что вы экспортируете содержимое в «текущую» директорию (вверху /media/disk/git_svn/subdir) - и конечный пункт, который вы экспортируете, несколько неудобно размещен, но он находится в DESTпеременной среды. Обратите внимание, что с этим скриптом; вы должны создать DESTкаталог вручную самостоятельно, прежде чем запускать вышеуказанный скрипт.

После запуска сценария вы сможете сравнить:

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

... и, надеюсь, увидим те же временные метки (для тех файлов, которые находились под контролем версий).

Надеюсь, это поможет кому-то,
Cheers!

Автор: sdaau Размещён: 15.07.2014 02:16

10 плюса

22742 Репутация автора

Для пользователей GitHub git archive --remoteметод не будет работать напрямую, так как URL-адрес экспорта является эфемерным . Вы должны спросить GitHub для URL-адреса, а затем загрузить этот URL-адрес. curlделает это легко:

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

Это даст вам экспортированный код в локальном каталоге. Пример:

$ 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

Изменить
Если вы хотите, чтобы код помещался в конкретный существующий каталог (а не случайный из github):

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1
Автор: bishop Размещён: 31.07.2014 01:58

9 плюса

3748 Репутация автора

Да, это чистая и аккуратная команда для архивирования вашего кода без включения git в архив и хорошо обойтись, не беспокоясь о какой-либо истории создания git.

git archive --format zip --output /full/path/to/zipfile.zip master 
Автор: zeeawan Размещён: 05.01.2015 09:42

3 плюса

26568 Репутация автора

На самом деле самый простой способ, которым я это видел (и работает над окнами) git bundle:

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

См. Этот ответ для получения более подробной информации. Как скопировать мой git-репозиторий с моей Windows-машины на Linux-машину через USB-накопитель?

Автор: B T Размещён: 05.04.2015 09:47

1 плюс

226 Репутация автора

Вариант 1 звучит не слишком эффективно. Что делать, если в клиенте нет места для клонирования, а затем удалить .gitпапку?

Сегодня я обнаружил, что пытаюсь это сделать, когда клиент - малина Pi, и почти не осталось места. Кроме того, я также хочу исключить некоторые тяжелые папки из репозитория.

Вариант 2 и другие ответы здесь не помогают в этом сценарии. Ни то, ни другое git archive(потому что требуется зафиксировать .gitattributesфайл, и я не хочу сохранять это исключение в репозитории).

Здесь я разделяю свое решение, похожее на вариант 3, но без необходимости git clone:

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

Изменение rsyncстроки для эквивалентной строки для сжатия также будет работать как git archiveс функцией исключения (как здесь задано ).

Автор: alexis Размещён: 12.06.2015 07:09

1 плюс

392 Репутация автора

У меня есть другое решение, которое отлично работает, если у вас есть локальная копия репозитория на машине, где вы хотите создать экспорт. В этом случае перейдите в этот каталог репозитория и введите следующую команду:

GIT_WORK_TREE=outputdirectory git checkout -f

Это особенно полезно, если вы управляете веб-сайтом с репозиторием git и хотите проверить чистую версию /var/www/. В этом случае добавьте эту команду в .git/hooks/post-receiveскрипт ( hooks/post-receiveв голом репозитории, который более подходит в этой ситуации)

Автор: Tom Размещён: 23.02.2018 10:30

2 плюса

19357 Репутация автора

Насколько я понимаю, это больше связано с загрузкой только определенного состояния с сервера, без истории и без данных других ветвей, а не извлечения состояния из локального репозитория (как это многие делают здесь).

Это можно сделать так:

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/
  • --single-branch доступен с Git 1.7.10 (апрель 2012 г.).
  • --depth(был?), по сообщениям, ошибочен, но для случая экспорта указанные вопросы не должны иметь значения.
Автор: Ondra Žižka Размещён: 12.03.2018 02:53
32x32