代码之家  ›  专栏  ›  技术社区  ›  Greg Hewgill

是否执行“Git导出”(如“SVN导出”)?

  •  2224
  • Greg Hewgill  · 技术社区  · 16 年前

    我一直在想是否有一个好的“git导出”解决方案可以创建一个没有 .git 存储库目录。我至少知道三种方法:

    1. git clone 然后移除 Git 存储库目录。
    2. git checkout-index 提到这个功能,但首先是“将所需的树读取到索引中…”,我不完全确定该怎么做。
    3. git-export 是第三方脚本, Git克隆 进入临时位置,然后 rsync --exclude='.git' 到达最终目的地。

    这些解决方案没有一个真正让我感到满意。最接近的 svn export 可能是选项1,因为这两个选项都要求目标目录首先为空。但是选项2似乎更好,假设我能理解将树读取到索引中意味着什么。

    31 回复  |  直到 6 年前
        1
  •  2262
  •   Jean-François Corbett    6 年前

    可能最简单的方法是 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的文件,如.git ignore和.gitattributes等。如果不希望这些文件包含在存档文件中,请确保在执行存档之前使用.gitattributes文件中的export ignore属性并提交此属性。 Read more...


    注意:如果您对导出索引感兴趣,命令是

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

    (见 Greg's answer 更多详细信息)

        2
  •  307
  •   etarion    12 年前

    我发现了选项2的含义。从存储库中,可以执行以下操作:

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

    路径末尾的斜杠很重要,否则将导致文件位于/destination中,前缀为'path'。

    因为在正常情况下,索引包含存储库的内容,所以对于“将所需的树读取到索引中”没有什么特别的操作。它已经在那里了。

    这个 -a 签出索引中的所有文件需要标记(我不确定在这种情况下省略这个标记意味着什么,因为它不做我想要的事情)。这个 -f 标志强制覆盖输出中的任何现有文件,而此命令通常不这样做。

    这似乎是我正在寻找的那种“git导出”。

        3
  •  243
  •   Aleksandr Somov    10 年前

    git archive 也可用于远程存储库。

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

    要导出repo中的特定路径,请添加任意多的路径作为git的最后一个参数,例如:

    git archive --format=tar \
    --remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
    
        4
  •  51
  •   Anthony Hatzopoulos    8 年前

    enter image description here

    如果存储库托管在GitHub上,则是一个特殊的案例答案。

    只使用 svn export .

    据我所知,Github不允许 archive --remote . 虽然Github是 svn compatible 他们有所有的吉特回购 svn 方便您使用 支持向量机输出 就像你通常会对你的Github URL做一些调整一样。

    例如,要导出整个存储库,请注意 trunk 在URL中替换 master (或者随便什么) project's HEAD branch is set to ):

    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 分支或 主人 分支可以使用 大旅行箱 :

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

    分支机构 将可在以下位置访问 /branches/ :

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

    所有 标签 在下面 /tags/ 以同样的方式:

    svn ls https://github.com/jquery/jquery/tags/2.1.3
    
        5
  •  38
  •   jperras    16 年前

    Git Manual :

    使用git checkout index“导出整棵树”

    前缀功能基本上使使用git checkout索引作为“export as tree”函数变得简单。只需将所需的树读取到索引中,然后执行以下操作:

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

        6
  •  38
  •   Daniel Schierbeck    16 年前

    我写了一个简单的包装纸 git-checkout-index 你可以这样使用:

    git export ~/the/destination/dir
    

    如果目标目录已经存在,则需要添加 -f --force .

    安装很简单;只需将脚本放到 PATH ,并确保它是可执行的。

    The github repository for git-export

        7
  •  36
  •   kostmo    15 年前

    似乎这与Git相比不是SVN的问题。Git只将.git文件夹放在存储库根目录中,而SVN将.svn文件夹放在每个子目录中。所以“svn导出”避免了递归命令行的魔力,而对于git递归则不需要。

        8
  •  26
  •   aredridel    13 年前

    相当于

    svn export . otherpath
    

    在现有回购协议中

    git archive branchname | (cd otherpath; tar x)
    

    相当于

    svn export url otherpath
    

    git archive --remote=url branchname | (cd otherpath; tar x)
    
        9
  •  22
  •   community wiki 4 revs, 2 users 75% user5286776117878    7 年前

    如果不排除 .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
    避免冗长

    此外,您可以从特定的提交修订中获取任何分支或标记,比如在SVN中,只需添加sha1(git中的sha1相当于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 GIT校验 不改变 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 -- ./
    

    注意到 ./ 相对于存储库的根目录

        10
  •  21
  •   slatvick    13 年前

    我广泛使用Git子模块。 这个适合我:

    rsync -a ./FROM/ ./TO --exclude='.*'
    
        11
  •  18
  •   Lars Schillingmann    13 年前

    在寻找导出Git存储库的方法时,我经常点击此页面。我对这个问题的回答考虑了与Git相比,SVN导出在设计上具有的三个属性,因为SVN采用集中存储库方法:

    • 它不导出所有修订版,从而最大限度地减少到远程存储库位置的流量
    • 它不包括导出目录中的元信息
    • 使用SVN导出某个分支是通过指定适当的路径来完成的。

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

    当构建某个发布时,克隆一个稳定的分支是有用的,例如 --branch stable --branch release/0.9 .

        12
  •  16
  •   Harmon    14 年前

    这将复制除.dot文件之外的所有内容。我用这个将git克隆的项目导出到我的web应用程序的git repo中,而不使用.git文件。

    cp-r./到git repo的路径/path/到/destination/

    简单的老巴什很有用:)

        13
  •  12
  •   teleme.io    11 年前

    与克隆一样简单,然后删除.git文件夹:

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

        14
  •  10
  •   dkinzer    14 年前

    我只是想指出,如果你是

    1. 导出存储库的子文件夹(这就是我使用SVN导出功能的方式)
    2. 是否可以将该文件夹中的所有内容复制到部署目标
    3. 因为您已经有了整个存储库的副本。

    那你就可以用 cp foo [destination] 而不是上面提到的 git-archive master foo | -x -C [destination] .

        15
  •  10
  •   bishop    10 年前

    对于GitHub用户, git archive --remote 方法不能直接工作,因为 the export URL is ephemeral . 您必须向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
    
        16
  •  10
  •   Community CDub    7 年前

    对, this 是一个干净整洁的命令,可以将代码存档,而不在存档中包含任何Git,并且可以在不担心任何Git提交历史的情况下传递代码。

    git archive --format zip --output /full/path/to/zipfile.zip master 
    
        17
  •  9
  •   orkoden    12 年前

    您可以将任何提交时的远程报告存档为zip文件。

    git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT
    
        18
  •  8
  •   community wiki 13 revs tocororo    13 年前

    Git导出的bash实现。

    我已经根据自己的功能对.empty文件创建和删除过程进行了分段,目的是在“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导出/tmp/rel-1.0.0

    正在将“.empty”文件添加到空文件夹中:…完成。

    正在签出索引组件:…完成。

    重置磁头和索引:完成。

    正在清除特定于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管理轮25445901 3 Nov 12:57/tmp/rel-1.0.0.tgz

    我现在已经将“git存档”功能合并到一个单独的进程中,使用“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;
      }
    
        19
  •  8
  •   Rob Jensen    13 年前

    如果你想要与子模块一起工作的东西,这可能值得一试。

    注:

    • master_dir=也签出子模块
    • dest_dir=此导出的结束位置
    • 如果你有同步,我认为你可以做同样的事情,甚至更少的球疼痛。

    假设:

    • 您需要从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

        20
  •  6
  •   Community CDub    7 年前

    这将把提交范围(C到G)内的文件复制到一个tar文件。注意:这只会提交文件。不是整个存储库。略改自 Here

    提交历史记录示例

    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-->递归到子树

    --没有提交ID-->git diff tree会在适用时输出带有提交ID的行。此标志抑制了提交ID输出。

    --仅显示名称-->仅显示更改文件的名称。

    --diff filter=acmrt-->仅选择这些文件。 See here for full list of files

    C..G-->此提交范围内的文件

    c~-->包括来自commit c的文件。不只是commit c之后的文件。

    | xargs tar-rf mytarfile-->输出到tar

        21
  •  5
  •   skiphoppy    12 年前

    我最喜欢的是 迪特 目标位于生成文件(或其他生成系统)中,该文件导出代码的可分发存档文件(.tar.bz2、.zip、.jar或任何适当的文件)。如果您碰巧使用GNU Autotools或Perl的MakeMaker系统,我认为这是自动存在的。如果没有,我强烈建议添加它。

    埃塔(2012-09-06):哇,严厉的否决。我仍然相信使用构建工具而不是源代码控制工具来构建发行版更好。我相信用构建工具构建工件。在我目前的工作中,我们的主要产品是以Ant为目标构建的。我们正处在转换源代码控制系统的过程中,而这个Ant目标的出现意味着迁移的麻烦就少了一点。

        22
  •  4
  •   troelskn    15 年前

    我需要这一个部署脚本,我不能使用上面提到的任何方法。相反,我想出了一个不同的解决方案:

    #!/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
    
        23
  •  4
  •   RkG    15 年前

    这样做很简单,这是一个.bash_配置文件的函数,它直接解压缩当前位置的存档文件,首先配置您通常使用的[url:path]。注意:使用此功能可以避免克隆操作,它直接从远程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
    }
    

    .gitconfig的别名,需要相同的配置(注意在.git项目中执行该命令,它以前总是跳转到基目录 as said here 在这个问题解决之前,我个人更喜欢这个功能

    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' -
    
        24
  •  3
  •   Community CDub    7 年前

    我想 @Aredridel 的帖子是最接近的,但还有一点-所以我会在这里加上这个;事情是,在 svn ,如果您在回购的子文件夹中,则执行以下操作:

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

    然后 视觉神经网络 将导出所有受修订控制的文件(它们也可能是新添加的;或修改的状态)-如果该目录中有其他“垃圾邮件”(我不计算在内 .svn 子文件夹,但可见的内容如 .o 文件) 将被导出;仅导出由SVN repo注册的那些文件。对我来说,一件好事就是这个导出还包括具有本地更改的文件 已经提交;另一个好处是导出文件的时间戳与原始文件的时间戳相同。或者,作为 svn help export 提出:

    1. 从指定的工作副本导出干净目录树 路径1,修订版时,如果给出,否则在工作时,进入 路径2。…如果未指定rev,则所有本地 将保留更改。不受版本控制的文件将 不可复制。

    意识到 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存档在给定树ID时的行为与给定提交ID或标记ID时的行为不同。 当前时间用作存档中每个文件的修改时间。在后一种情况下,记录的提交时间 在引用的提交对象中使用。

    …但显然这两个案例都设定了 每个 从而“文件”; 保留这些文件的实际时间戳!

    因此,为了同时保留时间戳,这里是 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 环境变量。请注意,使用此脚本,必须创建 在运行上述脚本之前,您自己手动创建目录。

    运行脚本后,您应该能够比较:

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

    …希望看到相同的时间戳(对于那些受版本控制的文件)。

    希望这能帮助别人,
    干杯!

        25
  •  3
  •   Community CDub    7 年前

    到目前为止,我看到的最简单的方法是 git bundle :

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

    有关详细信息,请参阅此答案: How can I copy my git repository from my windows machine to a linux machine via usb drive?

        26
  •  3
  •   Tom    7 年前

    如果您在要创建导出的计算机上有存储库的本地副本,我还有另一个可以正常工作的解决方案。在这种情况下,请移动到此存储库目录,然后输入以下命令:

    GIT_WORK_TREE=outputdirectory git checkout -f

    如果您使用Git存储库管理一个网站,并且希望在 /var/www/ . 在这种情况下,将此命令添加到 .git/hooks/post-receive 脚本(脚本) hooks/post-receive 在一个裸存储库上,这在这种情况下更适合)

        27
  •  3
  •   Ondra Žižka David Lilljegren    7 年前

    正如我理解的问题,它更多的是从服务器下载特定的状态,没有历史记录,也没有其他分支的数据,而不是从本地存储库提取状态(就像这里的许多anwser一样)。

    可以这样做:

    git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
    && rm -rf repo/.git/
    
    • --single-branch 自Git 1.7.10(2012年4月)起提供。
    • --depth 是(是吗?) reportedly 有缺陷,但对于出口而言,上述问题不应重要。
        28
  •  2
  •   Brandon    12 年前

    如果您也需要子模块,这应该可以做到: https://github.com/meitar/git-archive-all.sh/wiki

        29
  •  2
  •   DomTomCat    6 年前

    添加前缀(例如目录名)时,Git导出到zip存档:

    git archive master --prefix=directoryWithinZip/  --format=zip -o out.zip
    
        30
  •  1
  •   MichaelMoser    10 年前

    我在.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
    }