.git
目录。换句话说,我只想要文件。有方法可以做到这一点吗?
git clone --no-checkout
完全相反,它给了我.git
目录。我正在尝试为一个远程仓库做到这一点,而不是本地仓库,这意味着这不是“如何执行“git export”(如“svn export”)”的重复(即使解决方案可能最终相同)。
.git
目录。换句话说,我只想要文件。有方法可以做到这一点吗?
git clone --no-checkout
完全相反,它给了我.git
目录。git archive
。请参考备份使用git的项目:它将在一个归档文件中包含所有文件(如果您使用git-archive-all
脚本,则包括子模块)。.git
目录。git archive --remote=<repository URL> | tar -t
git archive --remote=<repository URL> | tar -t --exclude="*/*"
仅列出远程仓库的一级文件夹:
git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"
git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar
git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo
.git
。git --git-dir
是命令git
的选项,而非git clone
。
参见由René Scharfe (``)于2017年9月12日提交的提交4318094。"
git archive
",尤其是在使用pathspec时,在其输出中存储了一个空目录,即使Git本身从不这样做。
已经修复了此问题。
peff
)。gitster
--于2017年9月25日合并为提交62b1cb7)
archive
:不将空目录添加到存档文件中虽然Git不跟踪空目录,但
git archive
可以欺骗将其放入归档文件中。
虽然对象数据库支持此类操作,但无法在索引中表示,因此不太可能在实际使用中出现。由于Git不支持空目录,因此也不应将其写入归档文件中。
如果确实需要空目录,则可以通过在其中放置一个空的.gitignore
文件来跟踪和存档。
git --git-dir=/dev/null clone --depth=1 /url/to/repo
。 - HumanSkyclone
命令没有--git-dir
选项。只有--separate-git-dir
选项。”:--git-dir
不是git clone
的选项,而是git
的选项。 - VonCgit archive --remote=https://github.com/pornel/dssim.git @ | tar -t
我得到了 tar: This does not look like a tar archive
。它在 GitHub 上不起作用吗?另外,@
是什么意思? - André Werlang@
:我已将其删除。此外,GitHub不支持远程git archive
:我已编辑答案以提供替代方案。 - VonCgit archive --format=tar --remote=<repository URL> HEAD | tar xf -
这里提供的内容取自这里
tar x
中即可。 - Jens Bannmann您可以创建一个浅克隆来仅获取最近的几个修订版本:
git clone --depth 1 git://url
然后,您可以简单地删除 .git 目录或使用git archive
导出您的树。
clone
获取文件后,每次更新都需要使用 pull
。 - MMJ.git
目录,这样你就只有一个裸的工作副本呢?.git
目录的git仓库时,这有点令人困惑。如果你是指你只想要树的某个状态的副本,那么为什么不在shell中使用cp -R
而不是git克隆,然后再删除.git
呢?还有一种方法可以通过将仓库与工作树分离来完成。
如果您需要定期更新这些没有Git的Git文件,则此方法非常有用。例如,当我需要检出源文件并构建一个工件时,然后将工件复制到另一个仓库中以便部署到服务器时,我使用它,当我想将源代码推送到服务器时,我也会使用它,这样源代码就会检出并构建到www目录中。
我们将创建两个文件夹,一个用于Git,另一个用于工作文件:
mkdir workingfiles
mkdir barerepo.git
初始化一个空的Git仓库:
cd barerepo.git
git --bare init
touch hooks/post-receive
chmod ug+x hooks/post-receive
打开你喜欢的编辑器并编辑 post-receive 文件:
GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]
将此添加为远程:
git remote add myserver ssh://user@host:/path/to/barerepo.git
/workingfiles/
。但是 /workingfiles/
本身不受版本控制;在 /workingfiles/
中运行 git status
将出现错误提示:fatal: Not a git repository (or any parent up to mount point /data)
。它只是普通的文件。rm -r .git
命令,因此如果 /workingfiles/
是其他Git存储库,您不必担心所使用的命令会删除其他存储库的Git文件。这个解决方案最接近github页面上的“Download ZIP”按钮。一个优点是没有.git目录。另一个优点是它可以下载单个ZIP文件,而不是逐个下载每个文件,这可能会带来巨大的差异。可以通过wget命令行完成:wget -O "$(basename $REPO_URL)".zip "$REPO_URL"/zipball/master/
。唯一的问题是,有些存储库可能根本没有主分支。如果是这种情况,“URL中的master应该替换为适当的分支。
一旦ZIP文件下载完成,最终未压缩的目录名称可能仍然非常奇怪和意外。要修复这个问题,可以通过此脚本提取名称,并将其移动到URL的basename
中。最终的script.sh
可能如下所示(用evals处理空格):
#Script for downloading from github. If no BRANCH_NAME is given, default is "master".
#usage: script.sh URL [BRANCH_NAME]
__repo_name__='basename "$1"'
__repo_name__="$(eval $__repo_name__)"
__branch__="${2:-master}"
#downloading
if [ ! -e ./"$__repo_name__"".zip" ] ; then
wget -O "$__repo_name__"".zip" "$1""/zipball/$__branch__/"
fi
#unpacking and renaming
if [ ! -e ./"$__repo_name__" ] ; then
unzip "$__repo_name__"".zip" &&
__dir_name__="$(unzip -qql $__repo_name__.zip | sed -r '1 {s/([ ]+[^ ]+){3}\s+//;q}')" &&
rm "$__repo_name__"".zip" &&
mv "$__dir_name__" "$__repo_name__"
fi
这种方法适用于"仅文件"的情况,对于小型代码库的快速临时访问非常有效。
然而,如果源码库相当大,更新的唯一可能性是下载并重建所有内容,那么(据我所知)就无法更新缺少.git
目录的内容,所以必须重新下载整个代码库。在这种情况下,最好的解决方案是使用浅层克隆 git clone --depth 1 $REPO_URL
,如 VonC 已经解释的那样。但接下来怎么做呢?可以参考此链接进行"检查更新",并参考这个很棒的类似维基百科的答案进行更新。
Maintaining
部分,不需要重新下载整个仓库。第一次下载时使用clone --depth 1
,然后每次需要更新时都使用pull
,对吗? - MMJgit --work-tree=/tmp/files_without_dot_git clone --depth=1 \
https://git.yourgit.your.com/myawesomerepo.git \
/tmp/deleteme_contents_of_dot_git
/tmp目录中的两个目录都是即时创建的,无需预先创建。
/tmp/files_without_dot_git
,除了.git
文件夹和.git文件夹内容将进入文件夹/tmp/deleteme_contents_of_dot_git
,您稍后可以删除它。因此,您可以在/tmp/files_without_dot_git
文件夹中执行git init
以创建全新的存储库。 - Manoj听起来你只是想要源代码的副本。如果是这样,为什么不直接复制目录并从复制中排除.git目录?
git archive
现在(2017年第四季度)更加精确,不会包括空文件夹。 - VonC