[教學] git-32 建立遠端倉庫 - 討論區

[教學] git-32 建立遠端倉庫

文章瀏覽次數 2597 文章回覆數 11

特種兵

特種兵圖像(預設)

2020-04-24 18:30:16

From:211.23.21.202

到這裡,我們對於 git 本身已經介紹的差不多了。

接下來我們要分享的是遠端倉庫的部分。

之前的 git 都是在自己的電腦上運作,但實際與伙伴開發或者專案應該都是放在主機當中的。

像是 github 或自己公司的網站主機等等。

所以我們要在主機當中建立一個遠端倉庫,平常在自己的電腦寫程式,完成後再推到主機的倉庫,

然後從正式環境把倉庫的程式拉回來完成更新。

我們就以我家的檔案下載平臺為例,分享一下操作的過程。

準備

首先,我們要先建立好遠端倉庫,讓我們可以從電腦把資料推上去或拉回來。

遠端倉庫只要建立一次,以後就可以一直使用。

使用 git 推或拉的機制其實是透過 ssh 的連線,所以主機本身的 ssh 伺服器需要先架設好。

我們這邊以 git 教學為主,ssh 的部分就不多說了。

當然,主機也要裝好 git 套件,就像我們當時安裝了 windows 版的 git 那樣,現在只是改成 linux 版而已。

所以我們要準備的就兩件事:

  • 主機架設好 ssh server
  • 主機安裝好 git

建立遠端倉庫資料夾

我們使用 ssh 登入檔案下載平臺的主機,打算將遠端倉庫的資料夾叫做 repo

並且放在 /home 資料夾下面。

logo@gaga:~$ cd /home                                                           
logo@gaga:/home$ sudo mkdir repo                                                
[sudo] password for logo:                                                       
logo@gaga:/home$ cd repo
logo@gaga:/home/repo$ 

上面是 linux 的指令,已經操作 git bash 一陣子的我們應該不陌生,只差在 linux 需要執行權限時的 sudo 並輸入密碼而已。

我們已經在 /home 下建立了 repo 的資料夾,但目前他還是一個很單純的空目錄,跟 git 完全扯不上關係。

因為需要在 repo 寫入資料,所以 repo 的資料夾的權限和擁有者都需要設定好,至少自己要能存取,如果有其他伙伴合作群組的話也要考慮一下。

大致上就是 chown 跟 chmod 兩個 linux 指令吧。

初始化遠端倉庫

想要當成遠端倉庫,需要先初始化,也就是讓這個資料夾跟 git 開始關連,

就像我們當初在 windows 使用 git init 讓資料夾開始可以使用 git 的道理有點類似,

只是這次是倉庫,而不是 client 端。其實就是多了個 --bare 參數而已。

# 我們切換到 /home/repo 遠端倉庫的資料夾下 並使用 git init --bare 來初始化 repo 資料夾
logo@gaga:/home/repo$ git init --bare                                           
 Initialized empty Git repository in /home/repo/                                 

# 看看有什麼東西在裡面了
logo@gaga:/home/repo$ ls                                                        
 branches  config  description  HEAD  hooks  info  objects  refs                 

有這些就是成功囉。

提醒一下,如果有其他伙伴合作,記得 repo 裡面的權限要設定一下,因為大家都會把資料寫入該資料夾,所以都要有寫入的權限。

專案本地提交

接著,我們的檔案下載平臺還沒有 git 機制,所以也要把他弄好,這部分跟 windows 一樣。

就是切換到檔案下載平臺的程式所在資料夾做這幾件事:

  • git init
  • git add .
  • git commit -m '第一次提交'

初始化、記錄存檔與本地提交。

因為第一次提交,可能裡面有很多檔案與資料夾,就會需要一段時間,

如果有什麼不想上傳的,就在 .gitignore 設定。

# 看一下正式環境的狀態
logo@gaga:~$ git log -1                                            
 commit 692839b484e0b7e68046520aa8d68a84826d54ed                                 
 Author: logo <logo@gaga.tw>                                                     
 Date:   Sun Apr 19 13:16:36 2020 +0800                                          

     第一次提交                                                                  

設定本地到遠端倉庫的連結

我們需要在正式環境告訴 git 要推到哪個倉庫,或者要從哪個倉庫來拉取資料。

因此需要設定一下,在正式環境的資料夾下:

logo@gaga:~$ git remote add origin gaga.tw:/home/repo              
  • remote 遠端相關指令
  • add origin 增加 origin 這個名稱當作倉庫的代號,名字可以自己取
  • gaga.tw:/home/repo 倉庫的位置,包括 dns 與倉庫的絕對路徑,也可以用 ip

推上倉庫

專案做完第一次的本地提交後,我們要把他推到倉庫去,所以都在同一臺主機中。

logo@gaga:~$ git push origin master                                
 The authenticity of host 'gaga.tw (114.34.178.107)' can't be established.       
 ECDSA key fingerprint is SHA256:aCIuTdLtDzt4IFQF+l/F4SGlBnuyLdq4Gz79Iw/ayvg.    
 Are you sure you want to continue connecting (yes/no)? yes # 確定要連線                     
 Warning: Permanently added 'gaga.tw,114.34.178.107' (ECDSA) to the list of known
  hosts.                                                                         
logo@gaga.tw's password: # 輸入 ssh 連線密碼                                                        
 Counting objects: 189, done.                                                    
 Delta compression using up to 4 threads.                                        
 Compressing objects: 100% (185/185), done.                                      
 Writing objects: 100% (189/189), 194.72 KiB | 0 bytes/s, done.                  
 Total 189 (delta 74), reused 0 (delta 0)                                        
 remote: Resolving deltas: 100% (74/74), done.                                   
 To gaga.tw:/home/repo                                                           
  * [new branch]      master -> master                                           
  • push 推上倉庫,因為剛剛用 remote 設定好要推到哪邊了,所以只要這樣下指令就可以了
  • origin 就是剛剛設定的倉庫代號
  • master 就是目前的分支,一開始建立預設是 master 主幹道

透過上面的指令我們把正式環境的程式推到遠端倉庫去了。

本地協做

再來,我們是要在自己的電腦上開發程式,因此我們回到電腦端,

把倉庫的專案 clone 一份回來:

# 切換到 D 槽
$ cd /d

# 把專案 clone 回來
$ git clone logo@gaga.tw:/home/repo download                                    
 Cloning into 'download'...                                                      
 logo@gaga.tw's password: # 輸入 ssh 密碼                                                        
 remote: Counting objects: 189, done.                                            
 remote: Compressing objects: 100% (111/111), done.                              
 remote: Total 189 (delta 74), reused 189 (delta 74)                             
 Receiving objects: 100% (189/189), 194.72 KiB | 3.42 MiB/s, done.               
 Resolving deltas: 100% (74/74), done.                                           
  • clone 就是完整複製一份
  • logo@gaga.tw:/home/repo 帳號@位置:倉庫路徑
  • download 複製回來要放在 download 資料夾,不存在的話他會自己新增

我們切換到 download 資料夾下看一下 log

$ git log -1                                                                    
 commit 692839b484e0b7e68046520aa8d68a84826d54ed (HEAD -> master, origin/master, 
 origin/HEAD)                                                                    
 Author: logo <logo@gaga.tw>                                                     
 Date:   Sun Apr 19 13:16:36 2020 +0800                                          

     第一次提交                                                                  

就算是他自己新增的資料夾,也會幫我們初始化,看起來沒問題。

開發流程

最後,我們說明通常的開發方式與流程,現在每個要一起開發檔案下載平臺的伙伴都可以 clone 一份回去,

然後修改程式,本地提交,最後加上一個動作,就是把專案推到倉庫:

# 我修改了一些程式
$ git add .                                                                     

$ git commit -m '修正寄信錯誤問題'                                              
 [master 5204237] 修正寄信錯誤問題                                               
  1 file changed, 2 insertions(+), 2 deletions(-)                                

# 在本地端測試都沒問題了就可以推到倉庫                                                                                 
$ git push origin master                                                        
 logo@gaga.tw's password: # 輸入 ssh 密碼                                                        
 Enumerating objects: 7, done.                                                   
 Counting objects: 100% (7/7), done.                                             
 Delta compression using up to 8 threads                                         
 Compressing objects: 100% (4/4), done.                                          
 Writing objects: 100% (4/4), 409 bytes | 409.00 KiB/s, done.                    
 Total 4 (delta 3), reused 0 (delta 0)                                           
 To gaga.tw:/home/repo                                                           
    692839b..5204237  master -> master                                           

然後,我們到主機端的正式環境,將倉庫的專案拉回來,也就是更新正式環境的程式:

logo@gaga:~$ git pull origin master                                
 logo@gaga.tw's password: # 輸入 ssh 密碼                                                        
 remote: Counting objects: 4, done.                                              
 remote: Compressing objects: 100% (4/4), done.                                  
 remote: Total 4 (delta 3), reused 0 (delta 0)                                   
 Unpacking objects: 100% (4/4), done.                                            
 From gaga.tw:/home/repo                                                         
  * branch            master     -> FETCH_HEAD                                   
    692839b..5204237  master     -> origin/master                                
 Updating 692839b..5204237                                                       
 Fast-forward                                                                    
  include/def_func.php | 4 ++--                                                  
  1 file changed, 2 insertions(+), 2 deletions(-)                                

logo@gaga:~/www/download$ git log -1                                            
 commit 5204237f746438d67e5ac0136764cb01597551d9                                 
 Author: Logo Kuo <logo@forblind.org.tw>                                         
 Date:   Sun Apr 19 14:12:20 2020 +0800                                          

     修正寄信錯誤問題                                                            

這樣正式環境的程式才算更新完成,保險點就再做一次測試看有沒有什麼問題。

以後的開發流程就會是:

  • 先從遠端倉庫把最新的專案拉回本地端
  • 在本地電腦寫程式
  • 在本地測試程式
  • 測試完成後推上遠端倉庫
  • 到主機的正式環境將專案從倉庫拉回來更新
  • 在正式環境測試程式

所以正式環境只做 pull 的動作,不要直接去改正式環境的程式,這樣太危險了,

因為在正式環境修改程式,就只能在正式環境直接測試,這樣系統一有問題整個就是大亂。

一定要在自己的開發端寫程式並測試完成後推到倉庫,然後正式環境選個良辰吉時把專案拉回來更新。

比較大的系統要先發更新公告或按照更新時間或流程,不能隨時亂更新。

如果有和其他伙伴合作的專案,因為不確定對方有沒有推新版到倉庫,所以每次最好先拉回最新版專案再進行編輯。

當然,如果你編輯到一半,有人推新版上去,你在推上去時就會要你先 pull, 然後就會自動 merge,

有衝突就走之前分享過的衝突處理,處理完再 push 上去。

補充

在下 push 或 pull 時加上 -u 參數,之後只要直接輸入 git push 就可以了,

例如 git push -u origin master 這樣之後只要輸入 git push 就行了。

當然也可以自己建立 alias

而 pull 其實就是 fetch + merge 而已。

留言

#1

阿慶

阿慶圖像

2020-04-24 23:04:09

From:122.116.71.150

終於到了精采的遠端倉庫了!

#2

特種兵

特種兵圖像(預設)

2020-04-25 12:43:34

From:1.161.130.32

也慢慢要收尾了

#3

阿慶

阿慶圖像

2020-04-29 23:43:47

From:122.116.71.150

所以這樣建立的有點像是私人倉庫,只能讓有該倉庫帳號密碼的用戶可以連線
而 GitHub 的公開倉庫才是大家都可以 clone 的事嗎?

#4

特種兵

特種兵圖像(預設)

2020-05-01 10:57:47

From:1.161.142.239

對,但github也是要有帳號,只是申請帳號不用錢而已
如果是公開的專案,現在都不收費
但如果是不想公開的專案就要錢了

#5

貓貓蟲

貓貓蟲圖像

2020-05-03 16:01:53

From:220.132.235.30

github 一般都是拿來公開/私人side project用的

一般公司比較常看到的是自己架設的gitlab

不過我不知道gitlab無障礙如何

我感覺不到XD

#6

tsengwoody

tsengwoody圖像(預設)

2020-05-03 21:36:34

From:220.135.204.66

github 上個月開始已經調整成不論公開或私有倉庫無限協作者都是免費了。
其實去年私有庫就有開放免費但 有 3 人協作者限製,上個月調整價格後連私有的也無限製人數了。
https://github.com/pricing
gitlab 的話免費版的功能也算完整,最有差的應該是協作者還能細分權限角色,有可 push 或只能 pull/create issue 等等,對於人數較多分工細的專案這點是比較有誘因。
另外 gitlab 本身是開源的,所以可以在組織內自行架設伺服器跑 gitlab 服務,對資安有要求的組織也是首選,畢竟大組織都會 concern 資安的議題。且還記得 17 年誤刪資料事件大家也會怕怕的,不過自己架維運也是要成本就是,小組織還是滿推薦用 gitlab 雲服務。
gitlab 也有將那次事件整理公開對專管與 IaaS/devops 維運領域有興趣的也很推薦看。
https://about.gitlab.com/blog/2017/02/10/postmortem-of-database-outage-of-january-31/

#7

小羔羊

小羔羊圖像(預設)

2022-01-15 21:08:40

From:114.34.171.78

教學很棒,但強烈建議修改得更詳細一些,方便我這種小白閱讀,
比方說文中的主機,其實linux跟pc端都能叫主機,從頭看下來其實我要看好幾次,不然都搞混了,
如果文章中以pc端跟linux來描述本地跟遠端會更準確,讀者也更容易理解其中的邏輯,
另外很多下指令的地方,希望可以寫,
在linux也就是遠端主機輸入以下指令
xxx,
然後會列出以下結果
xxx
不然我常常會搞不清楚哪邊是指令,哪邊是輸入指令後列出來的結果,
最後讀後的感覺是對小白來說好像要看也不見得能看得懂,對大老來說根本不用看,比較可惜,
當然或許也是我理解上的問題,
不過還是建議可以在優化一下文章,或是重新整理後發到教學區也很不錯,
最終感謝特種兵老大的分享和勞動成果

#8

特種兵

特種兵圖像(預設)

2022-01-16 10:22:53

From:111.249.133.48

感謝建議,但我覺得你會有這種感覺是因為沒有從第一篇開始看。
有些觀念跟脈絡不是很清楚。
看提示符號應該會知道是在哪邊下的指令。
你自己有linux主機,這一點不應該搞不清楚才對。

#9

小羔羊

小羔羊圖像(預設)

2022-01-17 13:32:09

From:114.34.171.78

有可能是因為我沒有讓nvda念符號的關係,所以沒一個字一個字看看不出來,
反覆看了好多次,總算是差不多會弄了

#10

特種兵

特種兵圖像(預設)

2022-01-17 13:54:56

From:211.23.21.202

還是建議從頭看會比較好,不然遇到狀況會不知道該怎麼做

#11

小羔羊

小羔羊圖像(預設)

2022-01-17 16:14:10

From:114.34.171.78

好的