实例详解git init和git clone获取git仓库

发布时间 - 2022-04-02 00:00:00    点击率:

本篇文章给大家带来了关于git的相关知识,其中主要介绍了git init和git clone获取git仓库的相关问题,包括了git clone 从已有的git存储数据库中克隆仓库到本地目录等相关内容,希望对大家有帮助。

推荐学习:《Git教程》

使用git init和git clone获取git仓库

通常获取git仓库有两种方式:

  • 将本地未进行版本控制的本地目录转换为Git仓库;

  • 从其他服务器上克隆一个已存在的Git仓库;

1 git init 在本地目录上创建Git仓库

git init [-q | --quiet] [--bare] [--template=]
           [--separate-git-dir ]
           [--shared[=]] [directory]

该命令创建一个空的Git存储数据库,基本上会在.git目录中创建objectsrefs/headsrefs/tags,和模板文件。还会创建一个引用主分支的HEAD的初始HEAD文件。
如果$GIT_DIR环境变量被指定了,则会替代./.git目录作为一个存储库的基础。
如果objects目录是通过$GIT_OBJECT_DIRECTORY环境变量指定的,那么在此目录下创建sha1目录,否则就是默认的$GIT_DIR/objects目录。
在已有的Git存储库中运行git init是安全的,他不会覆盖已存在的东西。重新运行git init的主要原因是获取新添加的模板(或者如果是--separate-git-dir选项,则将Git存储库移到另一个地方)。

  • [-q, --quite]
    只打印错误信息和警告信息;
  • [--bare]
    创建一个裸仓库,不包括.git文件夹,如下:
  • [--template=]
    用于在初始化Git仓库时将模板文件夹中的文件拷贝到我们初始化时的.git存储数据库中,如果不指定,默认拷贝的是/usr/share/git-core/templates路径下的模板,里面包括如下内容:
    $ ls /usr/share/git-core/templates/
    branches  description  hooks  info
    如果指定自己默认路径则初始化的Git存储数据库如下:
    其中模板依次可通过--template=设置,$GIT_TEMPLATE_DIR环境变量设置,init.templateDir 配置设置,并且依次覆盖下一级设置。
  • [--separate-git-dir ]
    默认git init会在当前目录下创建一个.git文件夹来储存Git数据库,此命令可指定一个路径来初始化Git存储数据库,并在本地创建一个.git文件来链接到指定的目录中去:

    可以看到本地只有一个.git文件,文件中描述了当前仓库的Git存储数据库具体位置在哪里,并自动链接过去。
  • [--shared[=]]
    用于指定创建的Git存储数据库的读写权限,包括同组用户,所有用户等等权限设置,如果没有指定默认是group权限。感兴趣可以git init --help查看此选项具体用法。
  • [directory]
    如果指定了此选项,git init命令则会在此目录中运行,如果目录不存在还会创建该目录。

2 git clone 从已有的Git存储数据库中克隆仓库到本地目录

git clone [--template=]
          [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
          [-o ] [-b ] [-u ] [--reference ]
          [--dissociate] [--separate-git-dir ]
          [--depth ] [--[no-]single-branch] [--no-tags]
          [--recurse-submodules[=]] [--[no-]shallow-submodules]
          [--[no-]remote-submodules] [--jobs ] [--sparse] [--] 
          []

克隆一个仓库到新被创建的目录中,为克隆的Git存储库中每个分支创建远程跟踪分支(通过git branch --remotes可查看跟踪分支),并创建和检出克隆仓库当前活跃的分支到本地初始分支。
克隆完成后,一个不带参数的git fetch命令可以更新所有远程跟踪分支,并且不带参数的git pull命令还会将远程主分支合并到当前分支中。
这个默认配置是通过在refs/remotes/origin下创建对远程分支头的引用并且初始化remote.origin.urlremote.origin.fetch配置变量实现的。

  • [--template=]
    请看git init相关选项获取此选项作用。
  • [-l, --local]
    用于从本地Git存储仓库克隆Git存储数据库,此选项会拷贝本地的refs,HEAD等信息到克隆的Git存储数据库,并将.git/objects通过硬链接形式链接到本地Git存储库以节约本地空间。
    如果未指定-l选项但[url]是本地路径则还是会默认进行-l选项的行为,但是如果指定的是--no-local选项对本地仓库进行克隆则会走默认的git clone流程:
  • [-s, --shared]
    当克隆的仓库在本地时,默认是将本地仓库中.git/objects的对象通过硬链接的方式链接到本地的克隆仓库,使用此选项不会再硬链接.git/objects目录,而是在本地的.git/objects/info目录中创建一个alternates文件并在其中描述objects原先的位置并进行共享使用。
    注意:这个选项是一个危险的选项,除非你明白它的作用,否则不要使用它。如果使用这个选项克隆了本地仓库,然后删除了源仓库中的分支,一些对象可能会变成未被引用状态。而这些对象是可能被git的命令(git commit内部可能自动调用git gc --atuo)删除的,从而导致仓库被破坏。
    还需要注意:在用-s选项克隆的存储库中运行git repack时,如果没有指定--local,-l选项,则会将源存储库中的objects复制到克隆存储库中的一个包里面,从而消除了--shared选项带来的共享效果和节省的空间。直接运行git gc是安全的,因为默认使用的--local,-l选项。
    如果想在-s选项指定的仓库中打破对共享的依赖,则可以使用git repack -a命令将源存储库中的所有对象复制到克隆的存储库的一个包中。
  • [--no-hardlinks]
    强制在克隆本地仓库时使用拷贝的形式复制.git/objects中的内容而不是使用硬链接的形式,在进行Git存储库备份时这个选项就很有用。
  • [-q, --quite]
    安静的运行命令,进度不会报告到标准错误流中。
  • [-n, --no-checkout]
    克隆完成后不执行检出HEAD操作:
  • [--bare]
    创建一个裸的Git仓库。也就是说不创建/.git目录也不会将管理文件放到/.git中,而是为自己创建一个或者.git目录,里面保存的就是实际的Git数据库。这个选项也默认是--no-checkout的,不会检出任何HEAD,也不会自动跟踪任何远程分支,也不会创建相关的配置变量。
  • [--mirror]
    设置源Git存储库的镜像。类似于--bare,对比--bare--mirror不仅仅映射源的本地分支到目标的本地分支,它还映射所有引用(包括远程跟踪分支,笔记等),并设置refspec配置,以便所有这些引用都被目标存储库中的git远程更新覆盖。
    注意:--bare--mirror都是针对服务器使用,因为服务器只需要保存Git存储数据库而不需要实际操作git命令,所以当你在这两个选项创建的存储库执行Git命令会得到下面的打印:
    fatal: this operation must be run in a work tree
  • [-o , --origin ]
    未使用此选项时默认使用origin来跟踪远程仓库,使用此选项后使用来跟踪远程仓库。
  • [-b , --branch ]
    不要将新创建的HEAD指向克隆仓库HEAD指向的分支,而是指向分支。
  • [-u , --upload-pack ]
    在使用ssh访问要克隆的Git存储库时,它为另一端运行的命令指定了一个非默认的路径。这个选项主要针对Git服务器使用,为服务器使用的git等指定了一个路径。一般是/usr/bin/git-upload-pack,当服务器的git运行时会自动找到此路径的程序。
  • [--reference[-if-able] ]
    如果引用的Git存储库在本地机器上,自动的会设置.git/objects/info/alternates文件来从引用源存储库来获取objects,使用已经存在的Git存储库作为替代将会需要更少的objects被从源存储库拷贝过来,从而降低网络和本地存储成本。当使用--reference-if-able时,会跳过不存在的目录,并发出警告,而不是中止克隆。
  • [--dissociate]
    --reference引用的Git存储库借用objects对象仅减少网络传输,并且在通过对借用objects进行必要的本地复制来进行克隆后,停止从引用库中借用对象。当本地克隆已经从另一个存储库借用objects时,可以使用此选项来停止新存储库从相同的存储库借用objects。此选项也主要用于Git服务器。
  • [--separate-git-dir ]
    请看git init相关选项获取此选项作用。
  • [--depth ]
    创建一个浅克隆,其需要克隆的提交数量由指定,并获取所有分支顶部提交往后提交数量克隆到本地。如果也想简单克隆子模块也可以传递--shallow-submodules选项。
  • [--[no-]single-branch]
    顾名思义,--single-branch只会克隆Git存储库中指定的一个分支,远程Git存储库中其他分支不会在本地被克隆下来,也不会在本地跟踪其他远程分支,只会跟踪单个远程分支。
  • [--no-tags]
    不会克隆任何标签下来,并且在配置中设置remote..tarOpt=--no-tags,以确保后续git pullgit fetch也不会操作到标签,除非显式的操作标签。
    可以与--single-branch一起使用,以维护单个分支,在只维护某个缺省分支时很有用。
  • [--recurse-submodules[=]]
    克隆创建后,根据提供的初始化并克隆子模块,如果没有指定则所有子模块都被初始化和克隆。对于有多个条目的可以多次给出此选项。
    使用默认的此选项,相当于运行git submodule update --init --recursive
  • [--[no-]shallow-submodules]
    所有被克隆的子模块都浅克隆深度为1。
  • [--[no-]remote-submodules]
    所有被克隆的子模块的远程跟踪分支的状态来更新子模块,而不是记录在Git数据库中的SHA1。相当于将--remote选项传递给git submodule update
  • [-j , --jobs ]
    同时取出的子模块数,默认是配置submodule.fetchJobs
  • [--sparse]
    稀疏检出模式,所谓稀疏检出就是本地版本库检出时不检出全部,只将指定的文件从本地版本库检出到工作区,而其他未指定的文件则不予检出(即使这些文件存在于工作区,其修改也会被忽略)。这里不详细介绍此功能。
  • [--]
    无实际作用,只是为了将选项和操作对象分开以便易于区分。

  • 要克隆的仓库,可能是远程仓库,也可能是本地仓库,可以是https协议也可以是ssh协议或者git协议等等。
  • []
    如果指定了此目录,则会将Git仓库克隆到此目录中。
  • -v, --verbose
    冗长输出克隆信息。
  • [-c =, --config =
    在克隆仓库时为新创建的Git存储库设置一个配置变量,在克隆完成后立即生效

推荐学习:《Git教程》


# git  # if  # Directory  # 并发  # 对象  # 数据库  # https  # ssh  # 库中  # 创建一个  # 会在  # 则会  # 也不  # 数据库中  # 如果没有  # 的是  # 目录中  # 在此 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何与Pusher实现实时通信?(WebSocket示例)  深圳网站制作培训,深圳哪些招聘网站比较好?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何选择PHP开源工具快速搭建网站?  中山网站推广排名,中山信息港登录入口?  Python制作简易注册登录系统  Laravel怎么上传文件_Laravel图片上传及存储配置  微信小程序 wx.uploadFile无法上传解决办法  高防服务器租用首荐平台,企业级优惠套餐快速部署  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel如何创建自定义Facades?(详细步骤)  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何在万网开始建站?分步指南解析  Laravel如何集成Inertia.js与Vue/React?(安装配置)  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  香港服务器选型指南:免备案配置与高效建站方案解析  潮流网站制作头像软件下载,适合母子的网名有哪些?  非常酷的网站设计制作软件,酷培ai教育官方网站?  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何快速搭建支持数据库操作的智能建站平台?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何快速搭建高效简练网站?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel如何实现数据库事务?(DB Facade示例)  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Java类加载基本过程详细介绍  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  微信小程序 canvas开发实例及注意事项  昵图网官网入口 昵图网素材平台官方入口  EditPlus中的正则表达式实战(6)  怎么用AI帮你设计一套个性化的手机App图标?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  黑客如何利用漏洞与弱口令入侵网站服务器?  用yum安装MySQLdb模块的步骤方法  如何快速打造个性化非模板自助建站?  如何在香港免费服务器上快速搭建网站?  如何用已有域名快速搭建网站?  深入理解Android中的xmlns:tools属性  魔方云NAT建站如何实现端口转发?  JS碰撞运动实现方法详解