为啥“git clone”在传递本地 file:/// url 时会打包对象数据库?

Posted

技术标签:

【中文标题】为啥“git clone”在传递本地 file:/// url 时会打包对象数据库?【英文标题】:Why does "git clone" pack the object database when being passed a local file:/// url?为什么“git clone”在传递本地 file:/// url 时会打包对象数据库? 【发布时间】:2012-02-12 10:19:03 【问题描述】:

下面描述了为了重现观察到的行为而要执行的 bash 命令。虽然这些已经通过msysgit 运行,但我怀疑在 *nix 环境中结果应该是相似的。

设置源代码库

$ mkdir main && cd main
$ git init .
Initialized empty Git repository in d:/temp/main/.git/
$ echo a > a.txt
$ git add . && git commit -m "Initial commit"
[master (root-commit) e1ec355] Initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 a.txt

使用本地文件:/// url 克隆源存储库

$ cd ..
$ mkdir clonefromfileurl && cd clonefromfileurl
$ git clone file:///d:/temp/main
Cloning into 'main'...
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)

使用本地文件路径克隆源代码库

$ cd ..
$ mkdir clonefrompath && cd clonefrompath
$ git clone /d:/temp/main
Cloning into 'main'...
done.

根据Wikipedia,带有三斜杠的文件url表示本地资源。

但是,当通过本地file:/// url 进行克隆时,对象数据库在传输之前会被打包(复制?)。当源存储库的位置表示为本地路径时,情况并非如此。

考虑到源代码库和目标代码库都托管在localhost 上,为什么 git 的行为方式不同?

【问题讨论】:

【参考方案1】:

来自 git clone 手册:

对于本地存储库,也由 git 原生支持,可以使用以下语法:

/path/to/repo.git/ file:///path/to/repo.git/

这两种语法大部分是等价的,除了前者暗示了--local选项。

因此,当您使用file:/// 时,它并不意味着您必须明确添加--local 克隆。

【讨论】:

非常感谢您的回答。不幸的是,使用git clone -l file:///d:/temp/maingit clone --local file:///d:/temp/main 仍然会处理和传输包文件。你能重现这种行为吗?

以上是关于为啥“git clone”在传递本地 file:/// url 时会打包对象数据库?的主要内容,如果未能解决你的问题,请参考以下文章

git clone 更改文件修改时间

git clone 命令

Git-svn clone

git clone 远程库到本地的步骤

当我可以在“git init”之后对“git pull”做同样的事情时,为啥要“git clone”? [复制]

git本地无法git clone的问题(SSH方式)