当前位置:   article > 正文

git clone_git clone --mirror

git clone --mirror

1.不要把鸡蛋放在同一个篮子里

用法1:git clone <repository> <directory>

用法2:git clone  --bare  <repository>  <directory.git>

用法3:git clone  --mirror  <repository>  <directory.git>

用法1 将 <repository> 指向的版本库创建一个克隆到<directory>目录。

目录<directory>相当于克隆版本库的工作区,文件都会检出,版本库位于工作区下的.git 目录中

用法2和用法3创建的克隆版本库都不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。

一般约定俗称裸版本库的目录名以.git为后缀

用法3区别于用法2之处在于用法3克隆出来的裸版本库对上游版本库进行了注册,这样可以在裸版本库中使用git fecth命令和上游版本库进行持续同步


git push [<remote-repos>  <refspec>]

git pull  [<remote-repos>  <refspec>]

<remote-repos>是远程版本库的地址或者名称,<refspec>是引用表达式


2.对等工作区


不使用 --bare 或 --mirror 创建出来的克隆包含工作区,这样会产生两个包含工作区的版本库,这两个版本库是对等的。

这两个工作区本质没有区别,但往往提交是在一个版本(A)中进行的,另外一个(B)作为备份,

对于这种对等工作区模式,版本库的同步只有一种可行的操作模式,

备份库(B)执行git pull命令从原版本库(A)中拉回新的提交实现版本同步。

  1. $ git clone F:/gitdemo F:/gitdemo-backup
  2. Cloning into 'F:/gitdemo-backup'...
  3. done.


在gitdemo版本库 生成一些测试提交(使用--allow-empty参数可以生成空提交)

  1. $ git commit --allow-empty -m "sync test1"
  2. [master 1182f2e] sync test1
  1. $ git commit --allow-empty -m "sync test2"
  2. [master 81703be] sync test2


尝试push

  1. $ git push F:/gitdemo-backup
  2. fatal: The current branch master has no upstream branch.
  3. To push the current branch and set the remote as upstream, use
  4. git push --set-upstream F:/gitdemo-backup master


为了实现同步,需要进入到备份库中,执行git pull命令

  1. $ git pull
  2. remote: Counting objects: 2, done.
  3. remote: Compressing objects: 100% (2/2), done.
  4. remote: Total 2 (delta 1), reused 0 (delta 0)
  5. Unpacking objects: 100% (2/2), done.
  6. From F:/gitdemo
  7. 8cc0e9d..81703be master -> origin/master
  8. Updating 8cc0e9d..81703be
  9. Fast-forward


在gitdemo-backup版本库中查看提交日志,可以看到在gitdemo版本库中的新提交已经被拉回到gitdemo-backup版本库中

  1. $ git log --oneline -2
  2. 81703be sync test2
  3. 1182f2e sync test1


为什么执行git pull命令时没有像执行git push 命令那样提供那么多的参数呢?

这是因为在执行 git clone操作后,克隆出来的gitdemo-backup版本库中对源版本库(上游版本库)进行了注册,

所以在gitdemo-backup版本库中执行拉回操作,无须设置上游版本库的地址

在gitdemo-backup版本库中可以使用如下命令查看上游版本库的注册信息:

  1. $ git remote -v
  2. origin F:/gitdemo (fetch)
  3. origin F:/gitdemo (push)
  1. $ cat .git/config
  2. [core]
  3. repositoryformatversion = 0
  4. filemode = false
  5. bare = false
  6. logallrefupdates = true
  7. symlinks = false
  8. ignorecase = true
  9. hideDotFiles = dotGitOnly
  10. [remote "origin"]
  11. url = F:/gitdemo
  12. fetch = +refs/heads/*:refs/remotes/origin/*
  13. [branch "master"]
  14. remote = origin
  15. merge = refs/heads/master

3.克隆生成裸版本库


在对等工作区模式下,工作区之间执行推送,可能会引发大段的错误输出,如果采用裸版本库则没有相应的问题,这是因为裸版本库没有工作区。

没有工作区还有一个好处就是空间占用会更小。

  1. $ git clone --bare f:/gitdemo f:/gitdemo.git
  2. Cloning into bare repository 'f:/gitdemo.git'...
  3. done.

克隆出来的f:/gitdemo.git目录就是版本库目录,不包含工作区

查看f:/gitdemo.git目录的内容

  1. $ ls -F f:/gitdemo.git
  2. config description HEAD hooks/ info/ objects/ packed-refs refs/
  1. $ git --git-dir=f:/gitdemo.git config core.bare
  2. true

进入gitdemo版本库,生成一些测试提交

  1. $ git commit --allow-empty -m "sync test 3"
  2. [master 66c420d] sync test 3
  1. $ git commit --allow-empty -m "sync test 4"
  2. [master ccb2e4a] sync test 4


  1. $ git push f:/gitdemo.git master:master
  2. Counting objects: 2, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (2/2), done.
  5. Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
  6. Total 2 (delta 1), reused 0 (delta 0)
  7. To f:/gitdemo.git
  8.    81703be..ccb2e4a  master -> master


4.创建生成裸版本库


裸版本库不但可以通过克隆的方式创建,还可以通过git init命令以初始化的方式创建

  1. $ git init --bare f:/gitdemo-init.git
  2. Initialized empty Git repository in f:/gitdemo-init.git/
  1. $ ls -F f:/gitdemo-init.git
  2. config description HEAD hooks/ info/ objects/ refs/
  1. $ git --git-dir=f:/gitdemo-init.git config core.bare
  2. true

为该空版本库创建内容

  1. $ git push f:/gitdemo.git
  2. fatal: The current branch master has no upstream branch.
  3. To push the current branch and set the remote as upstream, use
  4. git push --set-upstream f:/gitdemo.git master
因为gitdemo-init.git版本库刚刚初始化完成,还没有任何提交,更不要说分支了。

当执行git push命令时,如果没有设定推送的分支,而且当前分支也没有注册到远程的某个分支,将检查远程分支是否有和本地相同的分支名(如master),如果有 则推送,否则报错。

  1. $ git push f:/gitdemo.git master:master
  2. Counting objects: 2, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (2/2), done.
  5. Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
  6. Total 2 (delta 1), reused 0 (delta 0)
  7. To f:/gitdemo.git
  8. 81703be..ccb2e4a master -> master
 可以简写:

  1. $ git push f:/gitdemo.git master
  2. Everything up-to-date

  1. $ git --git-dir=/f/gitdemo-init.git log --oneline -2
  2. ccb2e4a sync test 4
  3. 66c420d sync test 3


继续在gitdemo版本库中执行几次提交

  1. $ git commit --allow-empty -m "sync test 5"
  2. [master 53a931c] sync test 5
  1. $ git commit --allow-empty -m "sync test 6"
  2. [master 020e5bd] sync test 6

再次向gitdemo-init.git推送

  1. $ git push f:/gitdemo-init.git master
  2. Counting objects: 2, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (2/2), done.
  5. Writing objects: 100% (2/2), 273 bytes | 0 bytes/s, done.
  6. Total 2 (delta 1), reused 0 (delta 0)
  7. To f:/gitdemo-init.git
  8. ccb2e4a..020e5bd master -> master

















声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/507847
推荐阅读
相关标签
  

闽ICP备14008679号