範例詳解git init和git clone獲取git倉庫

2022-04-02 16:00:22
本篇文章給大家帶來了關於的相關知識,其中主要介紹了git init和git clone獲取git倉庫的相關問題,包括了git clone 從已有的Git儲存資料庫中克隆倉庫到本地目錄等相關內容,希望對大家有幫助。

推薦學習:《》

使用git init和git clone獲取git倉庫

通常獲取git倉庫有兩種方式:

  • 將本地未進行版本控制的本地目錄轉換為Git倉庫;

  • 從其他伺服器上克隆一個已存在的Git倉庫;

1 git init 在本地目錄上建立Git倉庫

git init [-q | --quiet] [--bare] [--template=<template_directory>]
           [--separate-git-dir <git dir>]
           [--shared[=<permissions>]] [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資料夾,如下:
    git init --bare
  • [--template=<template_directory>]
    用於在初始化Git倉庫時將模板資料夾中的檔案拷貝到我們初始化時的.git儲存資料庫中,如果不指定,預設拷貝的是/usr/share/git-core/templates路徑下的模板,裡面包括如下內容:
    $ ls /usr/share/git-core/templates/
    branches  description  hooks  info
    如果指定自己預設路徑則初始化的Git儲存資料庫如下: git init --template
    其中模板依次可通過--template=<DIR>設定,$GIT_TEMPLATE_DIR環境變數設定,init.templateDir 設定設定,並且依次覆蓋下一級設定。
  • [--separate-git-dir <git dir>]
    預設git init會在當前目錄下建立一個.git資料夾來儲存Git資料庫,此命令可指定一個路徑來初始化Git儲存資料庫,並在本地建立一個.git檔案來連結到指定的目錄中去:
    git init --separate
    可以看到本地只有一個.git檔案,檔案中描述了當前倉庫的Git儲存資料庫具體位置在哪裡,並自動連結過去。
  • [--shared[=<permissions>]]
    用於指定建立的Git儲存資料庫的讀寫許可權,包括同組使用者,所有使用者等等許可權設定,如果沒有指定預設是group許可權。感興趣可以git init --help檢視此選項具體用法。
  • [directory]
    如果指定了此選項,git init命令則會在此目錄中執行,如果目錄不存在還會建立該目錄。

2 git clone 從已有的Git儲存資料庫中克隆倉庫到本地目錄

git clone [--template=<template_directory>]
          [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
          [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
          [--dissociate] [--separate-git-dir <git dir>]
          [--depth <depth>] [--[no-]single-branch] [--no-tags]
          [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
          [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--] <repository>
          [<directory>]

克隆一個倉庫到新被建立的目錄中,為克隆的Git儲存庫中每個分支建立遠端跟蹤分支(通過git branch --remotes可檢視跟蹤分支),並建立和檢出克隆倉庫當前活躍的分支到本地初始分支。
克隆完成後,一個不帶引數的git fetch命令可以更新所有遠端跟蹤分支,並且不帶引數的git pull命令還會將遠端主分支合併到當前分支中。
這個預設設定是通過在refs/remotes/origin下建立對遠端分支頭的參照並且初始化remote.origin.urlremote.origin.fetch設定變數實現的。

  • [--template=<template_directory>]
    請看git init相關選項獲取此選項作用。
  • [-l, --local]
    用於從本地Git儲存倉庫克隆Git儲存資料庫,此選項會拷貝原生的refs,HEAD等資訊到克隆的Git儲存資料庫,並將.git/objects通過硬連結形式連結到本地Git儲存庫以節約本地空間。
    如果未指定-l選項但[url]是本地路徑則還是會預設進行-l選項的行為,但是如果指定的是--no-local選項對本地倉庫進行克隆則會走預設的git clone流程:
    git clone --no-local
  • [-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操作:
    git clone -n
  • [--bare]
    建立一個裸的Git倉庫。也就是說不建立<directory>/.git目錄也不會將管理檔案放到<directory>/.git中,而是為自己建立一個<directory>或者<directory>.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 <name>, --origin <name>]
    未使用此選項時預設使用origin來跟蹤遠端倉庫,使用此選項後使用<name>來跟蹤遠端倉庫。
  • [-b <name>, --branch <name>]
    不要將新建立的HEAD指向克隆倉庫HEAD指向的分支,而是指向<name>分支。
  • [-u <upload-pack>, --upload-pack <upload-pack>]
    在使用ssh存取要克隆的Git儲存庫時,它為另一端執行的命令指定了一個非預設的路徑。這個選項主要針對Git伺服器使用,為伺服器使用的git等指定了一個路徑。一般是/usr/bin/git-upload-pack,當伺服器的git執行時會自動找到此路徑的程式。
  • [--reference[-if-able] <repository>]
    如果參照的Git儲存庫在本地機器上,自動的會設定.git/objects/info/alternates檔案來從參照源儲存庫來獲取objects,使用已經存在的Git儲存庫作為替代將會需要更少的objects被從源儲存庫拷貝過來,從而降低網路和本地儲存成本。當使用--reference-if-able時,會跳過不存在的目錄,並行出警告,而不是中止克隆。
  • [--dissociate]
    --reference參照的Git儲存庫借用objects物件僅減少網路傳輸,並且在通過對借用objects進行必要的本地複製來進行克隆後,停止從參照庫中借用物件。當本地克隆已經從另一個儲存庫借用objects時,可以使用此選項來停止新儲存庫從相同的儲存庫借用objects。此選項也主要用於Git伺服器。
  • [--separate-git-dir <git dir>]
    請看git init相關選項獲取此選項作用。
  • [--depth <depth>]
    建立一個淺克隆,其需要克隆的提交數量由<depth>指定,並獲取所有分支頂部提交往後<depth>提交數量克隆到本地。如果也想簡單克隆子模組也可以傳遞--shallow-submodules選項。
  • [--[no-]single-branch]
    顧名思義,--single-branch只會克隆Git儲存庫中指定的一個分支,遠端Git儲存庫中其他分支不會在本地被克隆下來,也不會在本地跟蹤其他遠端分支,只會跟蹤單個遠端分支。
  • [--no-tags]
    不會克隆任何標籤下來,並且在設定中設定remote.<remote>.tarOpt=--no-tags,以確保後續git pullgit fetch也不會操作到標籤,除非顯式的操作標籤。
    可以與--single-branch一起使用,以維護單個分支,在只維護某個預設分支時很有用。
  • [--recurse-submodules[=<pathspec>]]
    克隆建立後,根據提供的<pathspec>初始化並克隆子模組,如果沒有指定<pathspec>則所有子模組都被初始化和克隆。對於有多個條目的<parhspec>可以多次給出此選項。
    使用預設的此選項,相當於執行git submodule update --init --recursive <pathspec>
  • [--[no-]shallow-submodules]
    所有被克隆的子模組都淺克隆深度為1。
  • [--[no-]remote-submodules]
    所有被克隆的子模組的遠端跟蹤分支的狀態來更新子模組,而不是記錄在Git資料庫中的SHA1。相當於將--remote選項傳遞給git submodule update
  • [-j <n>, --jobs <n>]
    同時取出的子模組數,預設是設定submodule.fetchJobs
  • [--sparse]
    稀疏檢出模式,所謂稀疏檢出就是本地版本庫檢出時不檢出全部,只將指定的檔案從本地版本庫檢出到工作區,而其他未指定的檔案則不予檢出(即使這些檔案存在於工作區,其修改也會被忽略)。這裡不詳細介紹此功能。
  • [--]
    無實際作用,只是為了將選項和操作物件分開以便易於區分。
  • <repository>
    要克隆的倉庫,可能是遠端倉庫,也可能是本地倉庫,可以是https協定也可以是ssh協定或者git協定等等。
  • [<directory>]
    如果指定了此目錄,則會將Git倉庫克隆到此目錄中。
  • -v, --verbose
    冗長輸出克隆資訊。
  • [-c <key>=<value>, --config <key>=<value]
    在克隆倉庫時為新建立的Git儲存庫設定一個設定變數,在克隆完成後立即生效

推薦學習:《》

以上就是範例詳解git init和git clone獲取git倉庫的詳細內容,更多請關注TW511.COM其它相關文章!