溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Git中如何創(chuàng)建一個(gè)本地倉(cāng)庫(kù)

發(fā)布時(shí)間:2021-11-08 11:46:19 來(lái)源:億速云 閱讀:168 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要介紹了Git中如何創(chuàng)建一個(gè)本地倉(cāng)庫(kù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)建一個(gè)新的項(xiàng)目目錄,并生成一些簡(jiǎn)單的文件內(nèi)容:

$ mkdir test_proj

$ cd test_proj

$ echo “hello,world” > readme.txt

在項(xiàng)目目錄創(chuàng)建新的本地倉(cāng)庫(kù),并把項(xiàng)目里的所有文件全部添加、提交到本地倉(cāng)庫(kù)中去:

$ git init #在當(dāng)前的目錄下創(chuàng)建一個(gè)新的空的本地倉(cāng)庫(kù)

Initialized empty Git repository in /home/user/test_proj/.git/

$ git add . #把前目錄下的所有文件全部添加到暫存區(qū)

$ git commit -m 'project init' #創(chuàng)建提交

[master (root-commit) b36a785] project init

1 files changed, 1 insertions(+), 0 deletions(-)

create mode 100644 readme.txt

Git目錄的結(jié)構(gòu)

git init命令在項(xiàng)目的頂層目錄中建了一個(gè)名為:“.git”的目錄,它的別名是 “Git目錄”(Git  directory)。這時(shí)”Git目錄”中雖然有一些文件,但是沒有任何提交(commit)在里面,所以我們叫它是空倉(cāng)庫(kù)(empty Git  repository)。

和  SVN不同,一個(gè)Git項(xiàng)目一般只在項(xiàng)目的根目錄下建一個(gè)“.git”目錄,而SVN則會(huì)在項(xiàng)目的每一個(gè)目錄下建一個(gè)”.svn”目錄;這也我喜歡Git的原因之一:)

Git把所有的歷史提交信息全部存儲(chǔ)在“Git目錄”里,它就是一個(gè)Git項(xiàng)目的倉(cāng)庫(kù);你對(duì)本地的源代碼進(jìn)行編輯修改后創(chuàng)建的提交也都會(huì)先保存在這里面,然后再推送到遠(yuǎn)端的服務(wù)器。當(dāng)我們我把項(xiàng)目目錄和“Git目錄”一起拷到其它電腦里,它能馬上正常的工作(所有的提交信息全都保存在Git目錄里);甚至可以只把“Git目錄”拷走也行,但是要再簽出(checkout)一次。

Git為了  調(diào)試的方便,它可以指定項(xiàng)目的Git目錄的位置。有兩種辦法:一是設(shè)置“GIT_DIR”環(huán)境變量,二是在命令行里設(shè)定“--git-dir--git-dir”參數(shù)指定它的位置,大家可以看一下這里(git(1)  Manual Page)。

庖丁解牛

前面的這些東東我在***篇里也大概的講過一些,但是今天我們想不但要開動(dòng)這輛叫“Git”的跑車,還想看看它里面有些什么樣的零件,是怎么構(gòu)成的。

OK,我們來(lái)看看“test_proj”項(xiàng)目里的“Git目錄”的結(jié)構(gòu):

$cd test_proj/.git

$ ls | more

branches/ # 新版的Git已經(jīng)不再使用這個(gè)目錄,所以大家看到它 #一般會(huì)是空的

COMMIT_EDITMSG # 保存著上一次提交時(shí)的注釋信息

config # 項(xiàng)目的配置信息

description # 項(xiàng)目的描述信息

HEAD # 項(xiàng)目當(dāng)前在哪個(gè)分支的信息

hooks/ # 默認(rèn)的“hooks” 腳本文件

index # 索引文件,git add 后把要添加的項(xiàng)暫存到這里

info/ # 里面有一個(gè)exclude文件,指定本項(xiàng)目要忽略的文件 #,看一下這里

logs/ # 各個(gè)refs的歷史信息

objects/ # 這個(gè)目錄非常重要,里面存儲(chǔ)都是Git的數(shù)據(jù)對(duì)象

# 包括:提交(commits), 樹對(duì)象(trees),二進(jìn)制對(duì)象 #(blobs),標(biāo)簽對(duì)象(tags)。

#不明白沒有關(guān)系,后面會(huì)講的。

refs/ # 標(biāo)識(shí)著你的每個(gè)分支指向哪個(gè)提交(commit)。

我先用git log命令來(lái)看一下這個(gè)Git項(xiàng)目里有哪些提交:

$ git log

commit 58b53cfe12a9625865159b6fcf2738b2f6774844

Author: liuhui998

Date: Sat Feb 19 18:10:08 2011 +0800

project init

大家可以看到目前只有一個(gè)提交(commit)對(duì)象,而它的名字就是:”58b53cfe12a9625865159b6fcf2738b2f6774844”。這個(gè)名字就是對(duì)象內(nèi)容的一個(gè)SHA簽名串值,只要對(duì)象里面的內(nèi)容不同,那么我們就可以認(rèn)為對(duì)象的名字不會(huì)相同,反之也成立。我在使用時(shí)一般不用把這個(gè)40個(gè)字符輸全,只要把前面的5~8個(gè)字符輸完就可以(前提是和其它的對(duì)象名不沖突)。為了方便表示,在不影響表達(dá)的情況下,我會(huì)只寫SHA串值的前6個(gè)字符。

我們可以用git cat-file來(lái)看一下這個(gè)提交里的內(nèi)容是什么:

$ git cat-file -p 58b53c

tree 2bb9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13

author liuhui998 1298110208 +0800

committer liuhui998 1298110208 +0800

project init

大家可以看到:提交“58b53c” 是引用一個(gè)名為“2bb9f0”的樹對(duì)象(tree)。一個(gè)樹對(duì)象(tree)可以引用一個(gè)或多個(gè)二進(jìn)制對(duì)象(blob),  每個(gè)二進(jìn)制對(duì)象都對(duì)應(yīng)一個(gè)文件。 更進(jìn)一步, 樹對(duì)象也可以引用其他的樹對(duì)象,從而構(gòu)成一個(gè)目錄層次結(jié)構(gòu)。我們?cè)倏匆幌逻@個(gè)樹對(duì)象(tree)里面有什么東東:

$ git cat-file -p 2bb9f0

100644 blob 2d832d9044c698081e59c322d5a2a459da546469 readme.txt

不難看出,2bb9f0”這個(gè)樹對(duì)象(tree)包括了了一個(gè)二進(jìn)制對(duì)象(blob),對(duì)應(yīng)于我們?cè)谇懊鎰?chuàng)建的那個(gè)叫  ”readme.txt”的文件。現(xiàn)在我們來(lái)看看這個(gè)”blob”里的數(shù)據(jù)是不是和前面的提交的內(nèi)容一致:

$ git cat-file -p 2d832d

hello,world

哈哈,熟悉的“hello,world”又回來(lái)了。

想不想看看提交對(duì)象、樹對(duì)象和二進(jìn)制對(duì)象是怎么在”Git目錄“中存儲(chǔ)的;沒有問題,執(zhí)行下面的命令,看看”.git/objects”目錄里的內(nèi)容:

$ find .git/objects

.git/objects

.git/objects/2b

.git/objects/2b/b9f0c9dc5caa1fb10f9e0ccbb3a7003c8a0e13

.git/objects/2d

.git/objects/2d/832d9044c698081e59c322d5a2a459da546469

.git/objects/58

.git/objects/58/b53cfe12a9625865159b6fcf2738b2f6774844

.git/objects/info

.git/objects/pack

如果大家仔細(xì)看上面命令執(zhí)行結(jié)果中的粗體字,所有的對(duì)象都使用SHA簽名串值作為索引存儲(chǔ)在”.git/objects”目錄之下;SHA串的前兩個(gè)字符作為目錄名,后面的38個(gè)字符作為文件名。

這些文件的內(nèi)容其實(shí)是壓縮的數(shù)據(jù)外加一個(gè)標(biāo)注類型和長(zhǎng)度的頭。類型可以是提交對(duì)象(commit)、二進(jìn)制對(duì)象(blob)、  樹對(duì)象(tree)或者標(biāo)簽對(duì)象(tag)。

如何clone一個(gè)遠(yuǎn)程項(xiàng)目

我身邊的很多朋友是因?yàn)橐玫侥硞€(gè)開源項(xiàng)目的代碼,所以才開始學(xué)習(xí)使用Git。而獲取一個(gè)項(xiàng)目的代碼的一般的做法就是用git  clone命令進(jìn)行直接復(fù)制。

例如,有些朋友可能想看一下***的linux內(nèi)核源代碼,當(dāng)我們打開它的網(wǎng)站時(shí),發(fā)現(xiàn)有如下面的一段提示:

URL

git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

URL下面的三行字符串表示三個(gè)地址,我們可以通過這三個(gè)地址得到同樣的一份Linux內(nèi)核源代碼。

也就是說下面這三條命令最終得到的是同一份源代碼:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

git clone http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

git cone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

我們先來(lái)看一下URL,git://、http://、https://這些代表是傳輸git倉(cāng)庫(kù)的協(xié)議形式,而“git.kernel.org“則代表了Git倉(cāng)庫(kù)存儲(chǔ)的服務(wù)器名字(域名),“/pub/scm/linux/kernel/git/torvalds/linux-2.6.git”  則代表了Git倉(cāng)庫(kù)在服務(wù)器上位置。

Git 倉(cāng)庫(kù)除了可以通過上面的git、http、https協(xié)議傳輸外還可以通過ssh、ftp(s)、rsync等協(xié)議來(lái)傳輸。git  clone的本質(zhì)就是把“Git目錄”里面的內(nèi)容拷貝過來(lái),大家想想看,一般的“Git目錄”里有成千上萬(wàn)的各種對(duì)象(提交對(duì)象,樹對(duì)象,二進(jìn)制對(duì)象......),如果逐一復(fù)制的話,其效率就可想而知。

如果通過git、ssh協(xié)議傳輸,服務(wù)器端會(huì)在傳輸前把需要傳輸?shù)母鞣N對(duì)象先打好包再進(jìn)行傳輸;而http(s)協(xié)議則會(huì)反復(fù)請(qǐng)求要傳輸?shù)牟煌瑢?duì)象。如果倉(cāng)庫(kù)里面的提交不多的話,前者和后者的效率相差不多;但是若倉(cāng)庫(kù)里有很多提交的話,git、ssh協(xié)議進(jìn)行傳輸則會(huì)更有效率。

不過現(xiàn)在Git對(duì)http(s)協(xié)議傳輸Git倉(cāng)庫(kù)做了一定的優(yōu)化,http(s)傳輸現(xiàn)在也能達(dá)到ssh協(xié)議的效率,有興趣的朋友可以看一下這里(Smart  HTTP Transport)。

好的,現(xiàn)在我們執(zhí)行了下面這條命令,把linux-2.6的***版源代碼clone下來(lái):

$cd ~/

$mkdir temp

$git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

Initialized empty Git repository in /home/liuhui/temp/linux-2.6/.git/

remote: Counting objects: 1889189, done.

remote: Compressing objects: 100% (303141/303141), done.

Receiving objects: 100% (1889189/1889189), 385.03 MiB | 1.64 MiB/s, done.

remote: Total 1889189 (delta 1570491), reused 1887756 (delta 1569178)

Resolving deltas: 100% (1570491/1570491), done.

Checking out files: 100% (35867/35867), done.

當(dāng)我們執(zhí)行了“git clone  git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git”這條命令后大家可以看到這條輸出:

Initialized empty Git repository in /home/user/temp/linux-2.6/.git/

這就是意味著我們?cè)诒镜叵冉艘粋€(gè)“l(fā)inux-2.6”目錄,然后在這個(gè)目錄建了一個(gè)空的Git本地倉(cāng)庫(kù)(Git目錄);里面將會(huì)存儲(chǔ)從網(wǎng)上拉下來(lái)的歷史提交。

下面兩條輸入代表服務(wù)器現(xiàn)在調(diào)用 git-pack-objects 對(duì)它的倉(cāng)庫(kù)進(jìn)行打包和壓縮:

remote: Counting objects: 1888686, done.

remote: Compressing objects: 100% (302932/302932), done.

然后客戶端接收服務(wù)器端發(fā)過送過來(lái)的數(shù)據(jù):

Receiving objects: 100% (1889189/1889189), 385.03 MiB | 1.64 MiB/s, done.

在我們執(zhí)行完上面的clone  linux-2.6代碼的的操作后,Git會(huì)從“Git目錄”里把***的代碼到簽出(checkout)到“l(fā)inux-2.6”這個(gè)目錄里面。我們一般把本地的“l(fā)inux-2.6”這個(gè)目錄叫做”工作目錄“(work  directory),它里面保存著你從其它地方clone(or  checkout)過來(lái)的代碼。當(dāng)你在項(xiàng)目的不同分支間切換時(shí),“工作目錄”中的文件可能會(huì)被替換或者刪除;“工作目錄”只是保存著當(dāng)前的工作,你可以修改里面文件的內(nèi)容直到下次提交為止。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Git中如何創(chuàng)建一個(gè)本地倉(cāng)庫(kù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

git
AI