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

git克隆,然后删除.git存储库目录。git签出索引暗示了这一功能,但以“只需将所需的树读入索引……”开头,我不完全确定该怎么做。gitexport是一个第三方脚本,本质上是将git克隆到临时位置,然后再将rsync--exclude='.git'复制到最终目标。

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


当前回答

我只是想指出,如果你是

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

然后,您可以只使用cpfoo[destination]而不是前面提到的gitarchive-master foo|-x-C[destination。

其他回答

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

#!/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

从Git手册:

使用git签出索引“导出整个树”

前缀功能基本上使使用git签出索引作为“导出为树”函数变得简单。只需将所需的树读入索引,然后执行以下操作:

$git签出索引--prefix=git导出目录/-a

到目前为止,我看到的最简单的方法(也适用于windows)是gitbundle:

git bundle create/some/bundle/path.bundle--全部

有关更多详细信息,请参阅以下答案:如何通过usb驱动器将git存储库从windows机器复制到linux机器?

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

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

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

路径结尾处的斜线很重要,否则将导致文件位于带有前缀“path”的/target中。

因为在正常情况下,索引包含存储库的内容,所以“将所需的树读入索引”没有什么特别的事情可做。它已经在那里了。

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

这似乎是我想要的那种“git导出”。