我一直在想,是否有一个好的“gitexport”解决方案可以创建一个没有.git存储库目录的树的副本。我知道至少有三种方法:
git克隆,然后删除.git存储库目录。git签出索引暗示了这一功能,但以“只需将所需的树读入索引……”开头,我不完全确定该怎么做。gitexport是一个第三方脚本,本质上是将git克隆到临时位置,然后再将rsync--exclude='.git'复制到最终目标。
这些解决方案中没有一个让我感到满意。最接近svn导出的可能是选项1,因为两者都要求目标目录首先为空。但选项2似乎更好,假设我能够理解将树读入索引意味着什么。
选项1听起来效率不高。如果客户机中没有空间进行克隆,然后删除.git文件夹,该怎么办?
今天我发现自己正在尝试这样做,客户是一个几乎没有空间的树莓派。此外,我还想从存储库中排除一些较重的文件夹。
选项2和此处的其他答案在这种情况下没有帮助。两个git存档(因为需要提交.gitattributes文件,我不想将此排除保存在存储库中)。
这里我分享了我的解决方案,类似于选项3,但不需要gitclone:
tmp=`mktemp`
git ls-tree --name-only -r HEAD > $tmp
rsync -avz --files-from=$tmp --exclude='fonts/*' . raspberry:
将rsync行更改为压缩的等效行也可以作为git存档,但有一种排除选项(如这里所要求的)。
这样做很简单,这是.bash_profile的一个函数,它直接在当前位置解压缩存档文件,首先配置您常用的[url:path]。注意:使用此功能可以避免克隆操作,它直接从远程存储库获取。
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项目中执行命令,它总是跳转到前面所说的基本目录,直到修复为止,我个人更喜欢这个函数
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' -