▲点击蓝色字体关注我,获取更多精彩内容
有几种方式获取一个 Git 仓库。一种是从网络上或者其他地方拷贝一个现有的仓库,另一种就是在一个目录中创建一个新的仓库。
git init
只需要简单地运行 git init 就可以将一个目录转变成一个 Git 仓库,这样你就可以开始对它进行版本管理了。
创建一个新的仓库来开始工作。
git initInitialized empty Git repository in .git
随着 Git 版本的不同,该目录下可能还会包含其他内容。不过对于一个全新的 git init 版本库,这将是你看到的默认结构。
ls -a. .. .gitcd .gitls -a. HEAD description info refs.. config hooks objects
HEAD 文件指向目前被检出的分支。
description 文件仅供 GitWeb 程序使用,里面没有只要一段话,无需关心。
info 目录包含一个全局性排除(global exclude)文件, 用以放置那些不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns)。
refs 目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针。
config 文件包含项目特有的配置选项。
hooks 目录包含客户端或服务端的钩子脚本(hook scripts)。
objects 目录存储所有数据内容。
index 文件保存暂存区信息。
在远程分支中改变默认分支。
git branch -v * dev a59e05c2 chore(readme): svg images (#11200)git branch -vv* dev a59e05c2 [origin/dev] chore(readme): svg images (#11200)git branch -u origin/dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.
把裸仓库放到服务器上,使用命令来为一个服务器创建一个空的祼仓库。
假设一个域名为 git.example.com 的服务器已经架设好,并可以通过 SSH 连接, 你想把所有的 Git 仓库放在 /root/src/git 目录下。假设服务器上存在 /root/src/git/ 目录,你可以通过以下命令复制你的裸仓库来创建一个新仓库:
scp -r vue.git root@git.example.com:/root/src/gitroot@git.example.com's password: config 100% 169 10.0KB/s 00:00 pack-e507976d957777276d17da6750e8a2bc1c18888f 100% 1540KB 1.6MB/s 00:00 pack-e507976d957777276d17da6750e8a2bc1c18888f.pack 100% 27MB 1.1MB/s 00:26 HEAD 100% 20 0.7KB/s 00:00 exclude 100% 240 9.0KB/s 00:00 description 100% 73 1.3KB/s 00:00 commit-msg.sample 100% 896 2.7KB/s 00:00 pre-rebase.sample 100% 4898 25.5KB/s 00:00 pre-commit.sample 100% 1638 36.9KB/s 00:00 applypatch-msg.sample 100% 478 6.3KB/s 00:00 fsmonitor-watchman.sample 100% 3327 7.1KB/s 00:00 pre-receive.sample 100% 544 13.8KB/s 00:00 prepare-commit-msg.sample 100% 1492 46.6KB/s 00:00 post-update.sample 100% 189 1.8KB/s 00:00 pre-applypatch.sample 100% 424 1.9KB/s 00:00 pre-push.sample 100% 1348 66.5KB/s 00:00 update.sample 100% 3610 22.8KB/s 00:00 packed-refs 100% 23KB 30.0KB/s 00:00
当在一个新目录或已有目录执行 git init 时,Git 会创建一个 .git 目录。这个目录包含了几乎所有 Git 存储和操作的东西。如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。
ls -a /root/src/git/vue.git/. .. config description HEAD hooks info objects packed-refs refs
由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统, 所以它还包含了一部分用于完成底层工作的子命令。这些命令被设计成能以 UNIX 命令行的风格连接在一起,抑或藉由脚本调用,来完成工作。这部分命令一般被称作底层(plumbing,管道)命令,而那些更友好的命令则被称作上层(porcelain,精美的)命令。
git clone
git clone 实际上是一个封装了其他几个命令的命令。它创建了一个新目录,切换到新的目录,然后 git init 来初始化一个空的 Git 仓库, 然后为你指定的 URL 添加一个(默认名称为 origin 的)远程仓库(git remote add),再针对远程仓库执行 git fetch,最后通过 git checkout 将远程仓库的最新提交检出到本地的工作目录。
git clone 命令多次用到,这里只列举几个有意思的地方。
克隆现有的仓库。
git clone https://github.com/vuejs/vue.git
使用了 --bare 选项来创建一个没有任何工作目录的 Git 仓库副本。
git clone --bare https://github.com/vuejs/vue.gitCloning into bare repository 'vue.git'...remote: Enumerating objects: 1, done.remote: Counting objects: 100% (1/1), done.remote: Total 56272 (delta 0), reused 0 (delta 0), pack-reused 56271Receiving objects: 100% (56272/56272), 27.36 MiB | 55.00 KiB/s, done.Resolving deltas: 100% (39435/39435), done.ls -a . .. vue.gitls -a vue.git . HEAD description info packed-refs.. config hooks objects refs
打包中使用它来解包一个打包好的 Git 仓库。
git log commit a59e05c2ffe7d10dc55782baa41cb2c1cd605862 (HEAD -> dev, origin/dev, origin/HEAD, origin/dev)Author: Ikko Ashimine Date: Thu Mar 12 06:26:53 2020 +0900 chore(readme): svg images (#11200) add ?sanitize=true to svgcommit 98b9270ab50fe393111dd1e57f9259636e0d980cAuthor: Evan You Date: Tue Mar 10 21:07:39 2020 -0400 chore: fix svg logosgit bundle create repo.bundle HEAD dev Enumerating objects: 29666, done.Counting objects: 100% (29666/29666), done.Delta compression using up to 4 threadsCompressing objects: 100% (8432/8432), done.Writing objects: 100% (29666/29666), 15.56 MiB | 118.89 MiB/s, done.Total 29666 (delta 20742), reused 29665 (delta 20741)
git clone repo.bundle repoCloning into 'repo'...Receiving objects: 100% (29666/29666), 15.56 MiB | 40.23 MiB/s, done.Resolving deltas: 100% (20742/20742), done.ls -a repo. .eslintignore .gitignore dist scripts.. .eslintrc.js BACKERS.md examples src.babelrc.js .flowconfig LICENSE flow test.circleci .git README.md package.json types.editorconfig .github benchmarks packages yarn.lock
最后,如何在一个被分成一个主项目与几个子项目的项目上开发,使用 --recursive 选项来让克隆一个带有子模块的仓库变得简单。
首先将一个已存在的 Git 仓库添加为正在工作的仓库的子模块。你可以通过在 git submodule add 命令后面加上想要跟踪的项目的相对或绝对 URL 来添加新的子模块,添加一个名为 “DbConnector” 的库。
git submodule init git submodule add https://github.com/chaconinc/DbConnectorCloning into 'DbConnector'...remote: Counting objects: 11, done.remote: Compressing objects: 100% (10/10), done.remote: Total 11 (delta 0), reused 11 (delta 0)Unpacking objects: 100% (11/11), done.Checking connectivity... done.
如果给 git clone 命令传递 --recurse-submodules 选项,它就会自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块。
git clone --recurse-submodules https://github.com/chaconinc/MainProjectCloning into 'MainProject'...remote: Counting objects: 14, done.remote: Compressing objects: 100% (13/13), done.remote: Total 14 (delta 1), reused 13 (delta 0)Unpacking objects: 100% (14/14), done.Checking connectivity... done.Submodule 'DbConnector' (https://github.com/chaconinc/DbConnector) registered for path 'DbConnector'Cloning into 'DbConnector'...remote: Counting objects: 11, done.remote: Compressing objects: 100% (10/10), done.remote: Total 11 (delta 0), reused 11 (delta 0)Unpacking objects: 100% (11/11), done.Checking connectivity... done.Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'
如果你已经克隆了项目但忘记了 --recurse-submodules,那么可以运行 git submodule update --init 将 git submodule init 和 git submodule update 合并成一步。如果还要初始化、抓取并检出任何嵌套的子模块, 请使用简明的 git submodule update --init --recursive。
「往期精选」 「往期精选」「往期精选」 中国的这个举动,让全世界都松了一口气 苹果把微信摁在地上摩擦? 84岁钟南山这50天的行程,看完泪目 点个“在看”中国会好起来的,对吗?↓↓↓