【问题标题】:Git clone without .git directory没有 .git 目录的 Git 克隆
【发布时间】:2012-07-16 02:26:16
【问题描述】:

在进行克隆时是否有要传递给git 的标志,比如不要克隆.git 目录?如果不是,那么在克隆后设置一个标志来删除.git 目录怎么样?

【问题讨论】:

  • 这个问题不是 How to do a "git export" (like "svn export") 的骗子。这个问题询问如何克隆一个(远程)存储库没有.git目录。被指控的骗子询问如何导出您已经拥有.git 目录的现有存储库。
  • 同意。正如“可能重复”的解决方案所说,您不能 git archive 远程存储库。

标签: git version-control git-clone


【解决方案1】:

使用

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • 深度选项将确保复制尽可能少的历史记录以获取该存储库。
  • 分支选项是可选的,如果未指定,将获得默认分支。
  • 第二行将使您的目录 dirformynewrepo 不再是 Git 存储库。
  • 如果您正在执行递归子模块克隆,深度和分支参数不适用于子模块。

【讨论】:

  • 对于那些感兴趣的人,它是 word designators 之一,是 Bash 和 zsh 中 history expansion 功能的一部分。
  • 有没有办法让repo中所有分支的depth=1?不仅仅是主分支或指定分支
  • 您可以使用 --no-single-branch 选项来执行此操作,因为 --depth 暗示 --single-branch,您可以使用 --no-single-branch 取消暗示它。 (取自 git clone 手册页)
  • 很好的答案,这在从例如克隆时很有用。 gitlab 并想重新开始
  • 使用!$,虽然在这种情况下在技术上是正确的,但并不能帮助不懂语法的人理解实际问题的答案。它还依赖于直接在第一个命令之后的第二个命令,并且在同一个 shell 中。如果有人忽略了这些隐含的要求,他们最终可能会完全删除其他内容。因此,我建议您可以通过明确指定名称 dirformynewrepo 作为 rm 命令的参数来改进您的答案,因为这将使两个命令之间的连接更加清晰。
【解决方案2】:

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

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

并且这只适用于本地路径和远程 ssh/rsync 路径,如果远程服务器只提供 git:// 或 https:// 访问,它可能不起作用。

【讨论】:

  • 不考虑.gitignore?
  • itub 是对的,这只是复制工作树。 git checkout 以前可以正确执行此操作,现在不再正确。
  • 那么,如果服务器只提供 git:// 访问怎么办?
【解决方案3】:

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

npx degit GIT_REPO

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

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

【讨论】:

    【解决方案4】:

    对于那些怀疑the --depth 1 solution的人,因为它仍然下载.git目录并且您需要之后手动删除它,也许您需要知道how git clone actually works

    当你通常克隆一个 repo 时,git 将你所有的文件(跨越提交)下载到 .git 目录中。当您使用--depth 1 进行克隆时,git 只会将最新版本的文件下载到.git。之后,git 将checkout 或从.git 检索这些文件到工作目录(不再下载)。

    而且很多时候,因为.git 中的文件对象是压缩的,你可以通过下载git clone --depth 1 的文件而不是下载未压缩的文件来节省更多的带宽。对于一些网速较慢的人来说,这是值得的(需要运行rm -rf)。

    我个人认为the git archive solution 更好,但由于 GitHub 不支持它,--depth 1 是要走的路。

    【讨论】:

    • 如果是 GitHub,为什么不只是 curl -L https://github.com/${owner}/${repo}/tarball/master | tar xz
    • @DesNerger 因为我们可以使用 ssh 从私有仓库轻松克隆
    【解决方案5】:

    你总是可以的

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

    【讨论】:

    • 下载所有内容并稍后删除目录?例如,emacs 在 .git 中有 95% 的 1GB。所以 --depth=1 显然是这里的解决方案。
    • 当我执行 depth=1 时,我仍然看到 .git 文件夹
    • @AryehArmon 你当然看到了。使用 --depth 不会阻止 .git 的创建,它只是使它成为一个浅拷贝,对于 .git 来说要小得多。但是,如果您根本不希望它在那里,则需要在之后将其删除。
    猜你喜欢
    • 2021-04-11
    • 2012-03-15
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多