首頁 > 軟體

Git/Gitlab抓取,提交,庫的遷移/備份及回收/重新命名

2020-06-16 16:47:16

1.gitlab基本概念

GitLab是一個基於 Web 的 Git 倉庫管理工具,且具有wiki 和 issue 跟蹤功能。GitLab 由 GitLab Inc. 開發,使用開源許可證。
GitLab 由烏克蘭程式設計師 Dmitriy Zaporozhets 和 Valery Sizov 開發。它由 Ruby 寫成。後來,一些部分用Go語言重寫。截止2016年12月,該公司有150名團隊成員,以及1400多名開源貢獻者。 GitLab被 IBM,Sony,Jülich Research Center,NASA,Alibaba,Invincea,O’Reilly Media,Leibniz-Rechenzentrum (LRZ),CERN,SpaceX 等組織使用。

2.gitlab庫建立

點選“New project”

按照上面步驟,最後點選“Create project”

3.檔案提交
在用戶端上(mac本的遠端終端上)進行如下操作:
Git global setup
git config --global user.name "wtf"
git config --global user.email "wtf@linuxmi.com"
git clone ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git
cd linux_datagrand
echo "this is a test file."  >  wtf.txt
cat wtf.txt
this is a test file !
git add .
git commit -m "add a file named wtf.txt"
git push -u origin master
這樣就可以將用戶端檔案上傳到gitlab的倉庫裡了。

4.檔案抓取
如果我在gitlab上linux_datagrand.git這個倉庫裡進行如下操作:
新增shiyan.txt和目錄test這兩個檔案,那麼我在用戶端應該怎麼操作才能將新增的檔案“拉取”到本地呢?
cd linux_datagrand
git pull 或 git pull --rebase origin master
說明:建議使用git pull,原因我會在下文說明。
cat linux_datagrand
wtf.txt  shiyan.txt  test

5.在存在的檔案下進行檔案遞交
如果我在終端上有個目錄檔案existing_folder,裡面的檔案需要遞交至git庫,而你又不想cp到目標庫再push,那麼你可以這樣做:
cd existing_folder
git init
git remote add origin ssh://git@gitlab.linuxmi.com:19234/linux/linux_datagrand.git
git add .
git commit -m "Initial commit"
在push之前先進性pull操作:
git pull --rebase origin master
如果不進行pull這一步,會報如下錯誤:
error: failed to push some refs to git。
然後:
git push -u origin master

6.庫的遷移或備份
##如我想把linux_datagrand.git這個庫裡的檔案遷移至linuxmi.git這個新庫中,要求如下:
(1)遷移的時候就要考慮到已有的分支;
(2)保留以前的提交記錄;
(3)不要把原生的程式碼直接提交到gitLab,這樣以前提交的記錄和分支就都沒有了。
##操作如下:
git clone ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git
cd linux_datagrand
ls
name.txt  shiyan.txt
##檢視當前的遠端倉庫:
git remote -v
origin  ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git (fetch)
origin  ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git (push)
##新增linuxmi.git這個遠端倉庫
git remote add test ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git
說明:新增遠端倉庫的格式:
git remote add  倉庫名字  [倉庫地址]
##檢視當前的遠端倉庫:
git remote -v
origin  ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git (fetch)
origin  ssh://git@gitlab.linuxmicom:19234/linux/linux_datagrand.git (push)
test    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (fetch)
test    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (push)
##把原生的分支push到遠端倉庫
git push -u test master
這個時候有報錯,內容如下:
error: failed to push some refs to 'ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
##解決方法:
(1)由於GitLab一些分支預設被保護,僅僅擁有master級別的使用者才能提交到保護分支,而且master分支預設是保護分支,其他使用者需要通過合併issue請求來提交上去。所以我們先關閉這個master分支保護: Project: "Settings" -> "Repository" -> “Protected Branches(Expand)”  -> "Unprotect"。
(2)使用命令:git push -f test master
所以把原生的分支push到遠端倉庫命令:
git push -f test master
##這個時候,我們已經把linux_datagrand.git這個庫裡的檔案遷移至linuxmi.git這個新庫中了。

7.庫的回收和重新命名
有的時候庫遷移完成之後,老的庫就不需要了,這個時候就需要我們去回收或重名了,接著上面的範例說明:
要求如下:
(1)我已經把linux_datagrand.git這個庫裡的檔案遷移至linuxmi.git這個新庫中了,那麼我不想再使用git clone ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git 建立本地庫;
(2)我想把linux_datagrand.git這個本地庫更改為linuxmi.git
操作如下:
cd linux_datagrand
##先刪除原先的origin
git remote remove origin
##檢視當前遠端倉庫
git remote -v
test    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (fetch)
test    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (push)
##我們一般都習慣使用origin,所以更改一下test這個名稱
命令格式:
git remote rename <old> <new>
git remote rename test origin
##再檢視當前遠端倉庫
git remote -v
origin    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (fetch)
origin    ssh://git@gitlab.linuxmicom:19234/linux/linuxmi.git (push)

8.git pull 和 git pull --rebase
##說明:
Git 作為分散式版本控制系統,所有修改操作都是基於原生的,在團隊共同作業過程中,假設你和你的同伴在本地中分別有各自的新提交,而你的同伴先於你 push 了程式碼到遠端分支上,所以你必須先執行 git pull 來獲取同伴的提交,然後才能 push 自己的提交到遠端分支。而按照 Git 的預設策略,如果遠端分支和本地分支之間的提交線圖有分叉的話(即不是 fast-forwarded),Git 會執行一次 merge 操作,因此產生一次沒意義的提交記錄,從而造成了遞交影象的混亂。
##解決:
其實在 pull 操作的時候,,使用 git pull --rebase 選項即可很好地解決上述問題。 加上 --rebase 引數的作用是,提交線圖有分叉的話,Git 會 rebase 策略來代替預設的 merge 策略。 使用 rebase 策略有什麼好處呢?借用一下 man git-merge 中的圖就可以很好地說明清楚了。
假設提交線圖在執行 pull 前是這樣的:

如果是執行 git pull 後,提交線圖會變成這樣:

結果多出了 H 這個沒必要的提交記錄。如果是執行 git pull --rebase 的話,提交線圖就會變成這樣:

F G 兩個提交通過 rebase 方式重新拼接在 C 之後,多餘的分叉去掉了,目的達到。

##結論:
大多數時候,使用 git pull --rebase 是為了使提交線圖更好看,從而方便 code review。
不過,如果你對使用 git 還不是十分熟練的話,我的建議是 git pull --rebase 多練習幾次之後再使用,因為 rebase 在 git 中,算得上是『危險行為』。

另外,還需注意的是,使用 git pull --rebase 比直接 pull 容易導致衝突的產生,如果預期衝突比較多的話,建議還是直接 pull。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-09/153907tm


IT145.com E-mail:sddin#qq.com