没有.git目录的Git克隆


144

git进行克隆时是否传递一个标志,例如不要克隆.git目录?如果不是,.git克隆后删除目录的标志如何处理?


41
这个问题不是如何进行“ git export”(如“ svn export”)的重复。这个问题问如何克隆(远程)存储库没有.git目录。涉嫌的欺诈行为询问如何导出已有.git目录的现有存储库。
mknaf

3
同意。您不能git archive按照“可能重复”的解决方案所述来远程存储库。
Vladislav Rastrusny 2014年

Answers:


214

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • depth选项将确保复制最少的历史记录以获取该存储库。
  • branch选项是可选的,如果未指定,它将成为master。
  • 第二行将使您的目录dirformynewrepo不再是Git存储库。
  • 如果您要进行递归子模块克隆,则depth和branch参数不适用于子模块。

19
哪些呢!$/.git是什么意思?
尔根·保罗(

15
对于那些感兴趣的人,它是单词指示符之一,是Bash和zsh 历史扩展功能的一部分。
Rufflewind'3

有没有一种方法可以使仓库中所有分支的depth = 1?不仅是
母公司

2
您可以使用--no-single-branch选项执行此操作,因为--depth表示--single-branch,因此您可以使用--no-single-branch取消暗示。(摘自git clone手册页)
Robert Stoddard

8
使用!$,尽管在这种情况下在技术上是正确的,但是它并不能帮助不认识语法的人理解实际问题的答案。它还依赖于第二条命令,该命令紧随第一条命令并在同一外壳中。如果有人忽略了这些隐含的要求,他们最终可能会完全删除其他内容。因此,我建议您可以通过将名称显式指定dirformynewreporm命令的参数来改善您的答案,因为这将使两个命令之间的连接更加清晰。
davidA

29

由于只需要文件,因此不需要将其视为git repo。

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

并且这仅适用于本地路径和远程ssh / rsync路径,如果远程服务器仅提供git://或https://访问,则可能无法使用。


那不会考虑.gitignore?
JJ Roman

itub是正确的,这只是复制工作树。git checkout过去可以正确执行此操作,现在不再可用。
西尔万

因此,如果服务器仅提供git://访问,您该怎么办?
Rainb

3

或者,如果安装了Node.js,则可以使用以下命令:

npx degit GIT_REPO

npx随附于Node,它允许您运行基于二进制节点的二进制程序包,而无需先安装它们(或者,您首先可以degit使用来全局安装npm i -g degit)。

Degit是由Svelte and Rollup的创建者Rich Harris创建的工具,他使用该工具通过克隆存储库而不保留git文件夹来快速创建新项目。但是它也可以用于克隆任何回购协议...


-1

你总是可以做

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

44
下载所有内容并稍后删除目录?例如emacs在.git中有1GB的95%。所以--depth = 1是显然的解决方案。
RParadox

1
当我执行depth = 1时,我仍然看到.git文件夹
Aryeh Armon

@AryehArmon当然可以看到它。使用--depth不会阻止.git的创建,只会使其成为浅表副本,因此.git的大小要小得多。但是,如果您根本不想要它,则需要在以后将其删除。
zeycus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.