用 submodule 的做法其實滿麻煩的,它的原理是:大專案紀錄某目錄是一個 submodule,所以大專案就不 track 該目錄的變更,而是 track 該目錄的 HEAD commit。該目錄的內容變更則交給他自己 track。也就是說,如果修改了小專案的內容,需要先去小專案裡面把修改 commit 進去後,再去大專案把小專案的新 commit id 給 commit 進去。光用講的都覺得混亂…
有天發現了 git-subtree 是個可以解決類似問題的工具,但差別在於 subtree 不需要事先指定哪個目錄是子專案,只要在需要的時候處理即可。什麼是需要的時候呢?
除了「需要的時候」以外,子專案就像是(其實根本就是)大專案的一部分,用原有的方式去操作 git 即可,相當單純!
我覺得以我找到的資料來說,Git SubTree 共編 Library 這篇文章是講得比較清楚易懂的,有些別的文章會舉例錯誤或不知所云….XD 不過我認為需要搭配 man page 服用會比較能理解。
下面就以 hexo 為例,練習把原本用 git-submodule 管理的 theme(crboy-icarus)改成用 git-subtree 管理,並推到相同的 remote repository 去吧。
首先把 theme 的 origin 記下來,然後刪除這個 submodule
|
|
完成之後,原本的 submodule 現在已經成為上層專案的一部份了,任何修改都可以直接 commit 進上層專案就好。如果要把變更送到 remote theme-crboy-icarus 去,可以這樣做:
|
|
如果這個子專案在別地方被更新了,那可以這樣把更新拉進來:
|
|
總結一下:用 subtree 當然是也有一些缺點的,例如子專案的東西會在母專案裡也存一份,所以會讓 git repo 變大。但這問題在現代來說不是很嚴重,整體而言我認為 subtree 比 submodule 方便得多,我會傾向使用 subtree。至於 submodule 的使用情境,目前只想到要 include 一個外部專案,而且我確定完全不會去改它的時候才比較可能使用吧。
參考資料:
雖然對於 github pages 本來給我的 crboy.githb.io 用起來是沒問題,但我自訂的 domain 可就沒辦法了。
找了一下有沒有現成解決方案,找到這篇文章:Set Up SSL on Github Pages With Custom Domains for Free,裡面教你透過 CloudFlare 的 Flexible SSL 來設定,後半段則是教你怎麼強制使用 SSL。但我只想要單純支援 SSL,不反對 user 使用 http 連線,所以後半段就不理他了。進一步找「cloudflare flexible ssl」找到這篇文章:[免費SSL]Cloudflare 免費憑證讓網站綁上SSL加密連線(https),得知原理其實很簡單:讓流量通過 cloudflare(也就是 enable 他的 cdn 功能),cloudflare 會幫你對外提供可用的 ssl 憑證。
設定方式:
DOMANE_NAME/*
(例如 hexo.crboy.net/*
),setting 新增 SSL 並指定為 flexible不過倒是有個小小的問題…..這張憑證簽給好多 domain 啊…..而且除了我的 domain 以外也有別人的 domain,而且都是 wildcard….覺得有點擔心呢XD
另一個方式(需要花點錢)是透過 AWS 的 CloudFront(也是 CDN 服務),他也有一樣模式的東西,AWS 會幫你簽一張憑證,不過這憑證是專門簽給那個 domain 的。實際上是在 AWS Certificate Manager (ACM) 中自己決定要簽給哪些 domain,AWS 會寄信給 domain 的管理者請求 approve。雖然這樣安心多了,不過要花錢….就算了吧XD
]]>剛剛發現 ipinfo.io 這個網站,用瀏覽器開的話相關說明也都有了。但如果直接用 curl
送 request 的話,就可以拿到自己的 ip 的相關資訊(包含地點、國家等)。
|
|
也可以查詢特定 ip 的資訊:
|
|
甚至 fetch 特定欄位資料:
|
|
|
|
還有一些好玩的….像是:
|
|
|
|
bogon: 1
根據維基百科上 Bogon filtering 的描述,看來是有擋掉不應該被查詢的 ip。不過….
|
|
看起來還是有些特別的 ip 可以查XD 原來這台主機放在 AWS EC2 的日本機房嗎……(思)
]]>不過在 config 的時候遇到問題,怎麼改都沒效。後來找到這篇文章,裡面寫到這段話:
hexo-config 方法会去 theme 主题下的 _config.yml 中查找参数中的配置项
原來是會讀取 theme 底下的 _config.yml
啊!難怪我改 Hexo 的 _config.yml
(根目錄那一個)沒辦法起作用。不過奇怪的是,像是 customize.profile.author
之類的設定,在 Hexo 的 config 中修改,會起作用。不曉得 Hexo 在這邊是怎麼處理的…
於是我重新找了一下,發現這類工具好像還是以 Octopress 跟 Hexo 為大宗,而且 Hexo 據說比較易用,還是台灣人做的,當然要支持一下。(而且聽說 page render 的效能差很多….XD)
那麼,就開始學 Hexo 該怎麼用了!
或許有人會說,「我寫 prototype 超快我超強!」但你再強你有人家設計師用 photoshop 隨便畫畫強嗎?雖然人家畫出來的就是一張圖,不會動也不能點,但是省時省力,又能把想表現的重點突顯出來,用來作為前期的討論跟比較相當適合!可能講成這樣還是有人鐵齒…那試想一個狀況:客戶看了你的 prototype 之後,跟你講了一堆元件說要換位置,下面這個按鈕移到上面去(立刻修改HTML),這個選單要大一點(趕快調整 font-size, width, height,啊破版了再改一下另外那個…),這些東西的間距要小一點,整個寬度要一樣(調 margin 調老半天)…..總而言之,對於外觀的要求,在圖片上討論常常比在程式碼中討論來得容易,所以也才有所謂的 wireframe 與 mockup 的出現。
這邊不深究 wireframe 與 mockup 兩者的差別,下面通通用 mockup 來表示。Mockup 是一種用來呈現成品大致外觀的工具,他不能拿來使用,但是可以讓人容易想像成品的呈現方式 (人類果然是視覺的動物…)。以前看過一些人是用 photoshop 之類的影像處理軟體在畫 mockup,之後才去作切版套版…但對於一個美術白癡而言實在太困難了,小弟實在是 photoshop 苦手orz。好在有人推薦了這套工具:Balsamiq Mockups,他是一個很好用的畫 mockup 工具,內建數十種常用元件,可以用來設計網站、視窗程式或是手機介面。下面就直接來介紹一下。
下載跟安裝都很簡單,不多說了,Google 一下或是點上面的連結就可以下載….我是在 Mac 上安裝的,但他也有 Windows 跟 Linux 版,甚至還有 Google Drive 的 plugin (!)
這是開啟後的畫面,可以看到左下角指出我只有 7 天的試用期,購買的話則是美金 $79,其實對我來說有點貴XD 但如果是工作所需的話,其實這個價倒不會有什麼問題…
只要花幾分鐘,從上面拉一些元件下來,打幾個字(不打也沒關係,他都有預設的文字),就可以快速「畫」出一個網站…我實在很喜歡這個 browser window,讓我畫出來的東西突然加了20分….XD
覺得中間的框框實在不太好看…所以就塞了點假文章進去。(我用了一個英文的假文產生器,如果想寫中文的可以參考看看和多的中文假文產生器) 嗯….看起來還算有模有樣呢~
裡面的元件實在太多了,每次都要用選的很麻煩,如果知道大概名字的話,可以透過左上角的 Quick Add 直接搜尋加入
元件中文字的設定也很簡單,常常都是簡單打個字他就會幫你做出想要的東西了,前提當然是元件要用對…每個元件預設都有範例可以依循,所以不用擔心不會打,基本的用法都已經在範例中了!
每個元件也都有相關的一些外觀設定可以用,可以隨意玩玩
例如這個圖片元件(Image),預設是一個 placeholder 的角色,但也可以讓你放入真正的圖片在你的 mockup 中
還可以剪裁圖片成你要的樣子
放在畫面中大概就長這樣………XD
另外 Balsamiq Mockups 也提供 iPhone 的框框,最有趣的是還有 iPhone 4 跟 iPhone 5 可以選XDDDD,當然也有不同方向提供你作設計。
既然有手機元件可以玩,那就自以為很潮的來作個手機版網頁…把旁邊的主要元素複製一份移到手機框框裡面,調整大小之後,就完成了基本的元素!其實就像 RWD 一樣,都是一樣的元素,只是套用了不同 CSS 一樣…然後接著在右上角加個會跳出選單的小 icon,噢,Balsamiq Mockups 提供的 icon 還滿多的,還不賴!
於是乎….就完成了一個看起來好像有模有樣的「網站雛形」。如果要拿來做文件,或是提供給一般人看,其實這樣就可以假裝很威了,哈哈!這些東西做起來花不到 20 分鐘呢~其中還包含慢慢瀏覽有哪些元件可以用的時間。如果用 photoshop 來畫,以我的能力可能要花一整個早上吧….@@
再來是關於中文的問題,以前的版本會無法顯示中文,所以上面的 demo 才會全部都用英文來當範例,結果沒想到,現在的版本已經把中文的問題解決了XD 所以不需要「Use System Font」才能使用中文囉!雖然這字體實在不像英文版這麼可愛….但至少能用啦XD
最後,總不能畫完東西只給自己看吧XD Balsamiq Mockups 提供 export 的功能,可以輸出成 PNG 圖檔或是 PDF 檔,當然也可以放進系統剪貼簿或是直接列印出來。
這樣的工具也許有些人(可能是專業設計師或 photoshop 強者)認為沒什麼,但每樣工具都有他不同的目標。Balsamiq Mockups 並沒有辦法用來作各種不同的繪圖,但是他專注於繪製 mockup 這件事上,所以可以讓這件事變得很簡單,門檻很低,特別是對小弟這種美術白癡來說相當受用!不管是網站設計公司、SOHO或是要設計教材之類的用途,都相當實用。推薦~ :P
]]>在網路上搜尋通常會找到 Git for Windows 跟 msysGit 這兩個不同的名詞,我過去一直沒辦法很清楚的把他們兩者區分開來。根據 msysgit 在 github 上的首頁 與 StackOverflow 上的討論,我目前的理解是:
git pull
取得最新版的 msysGit 來編譯,算是給 git 開發者用的。git.exe
還有其他執行檔們…其中只包含了基本的 msys 環境、有 bash、ssh、甚至 Git GUI 等工具,但是沒有 toolchain,適合單純使用(操作)git 的使用者安裝。另外還可能會找到一個更有名的東西,稱為 TortoiseGit,這是知名專案 TortoiseSVN 的相關專案,顧名思義,就是烏龜殼包了 Git 啦!要注意的是,他只是一個 Git frontend,需要指定相關執行檔 (如 git.exe
) 的位置才能工作。特別的是,他本身附帶了 PuTTY 的 ssh client (plink.exe
),讓使用者可以透過比較符合 windows 使用習慣的方式來使用 ssh,如果不是很熟 linux 或是 GUI 狂熱份子可能會比較喜歡。XD
註:知名專案 cygwin 也可以安裝 git 並在 command line 下使用,但對於沒在使用 cygwin 的使用者而言麻煩得多,故此處不介紹。
這篇文章分成三個部分:首先介紹 Git for Windows (免 compile 的那個) 的安裝,接著是 msysGit (需要 compile 的那個) 的安裝,最後會介紹 TortoiseGit 的安裝,並以一個簡單的 git clone 作為結束。如果是一般單純想在 windows 上用 git 的人,可以只看第一跟第三部分即可,第二部分就當作參考資料吧!
另外報告一下我用的環境:
到 msysGit 的官方網站下載 Git-(版本)-(日期).exe
開始安裝
安裝精靈
預設的安裝位置,TortoiseGit 預設也是搜尋這個位置,建議不要改
因為環境是 Windows 7,我就不加入快速啟動了。另外,這一頁最下面的選項 (被遮住了) 如果勾選的話,可以把 Windows 本來的 command line (cmd.exe
) 的字型也變好看,是否要用就見仁見智囉
建議保留 Git Bash,至於要不要把 unix tools 加入 windows command line 的 path 就看人了,如果不了解的話,保留預設值 (第一個) 即可
關於換行格式的問題。除非有特殊考量,一般使用第一個選項會比較通用
安裝完成後,桌面上會出現 Git Bash 的 icon
桌面上按右鍵就看得到快顯功能表已經新增 Git 相關選項了,安裝完成!
這是 Git Bash 的執行畫面,會操作 Linux 的人應該會很容易上手
這個則是 Git GUI 的執行畫面,如果所在目錄不是 git repository 的話,只會有這三個選項
可以 clone repository (就是 git-clone
)
如果在 git repo 中執行 Git GUI 的話,會看到一個具有完整 git 功能的畫面
如果是 Linux user,或是只想要以最簡單的方式使用 git 的話,其實只要安裝這個就夠了。透過 Git Bash 就可以像一般 Linux 上操作,透過 Git GUI 也可以進行同樣功能的操作。
需要注意的是,如果單純使用 WinGit 的話,要使用 ssh 必須手動透過指令去設定。就像在 Linux 上一樣,ssh key 放在 ~/.ssh 底下,可以透過 git bash 去執行 ssh-keygen 來產生 key。
到 msysGit 的官方網站下載 msysGit-fullinstall-(版本)-(日期).exe
(或是 netinstall
版,但是因為某些意外,他們的安裝行為有微妙的差異)
安裝 msysGit
選擇安裝位置
這邊有件奇妙的事情,fullinstall 版的預設會在這目錄下建立一個 msysgit
的目錄,造成真正的安裝路徑為 C:\msysgit\msysgit
,而 netinstall 版就沒有這個問題。這裡我們保留預設值,雖然奇怪但不影響後面的操作。
安裝中
檔案複製完成後,自動開始編譯
編譯完成
到 TortoiseGit 的官方網站下載 TortoiseGit-(版本)-(32bit|64bit).msi
安裝 TortoiseGit
TortoiseGit 似乎比較想要我們用 TortoisePLink,那就用用看吧!
如果你是安裝 msysGit (自行編譯那個) 的話,啟動 TortoiseGit 的時候會跳出錯誤訊息,他找不到 git.exe
,也就是 Git 的執行檔。如果是安裝 WinGit 的話就沒有這個問題
如同前面所說的,msysGit 被裝在 C:\msysgit\msysgit
裡了,而我們想要找的執行檔位於 bin
底下
選好後,「Git.exe Path:」的後面應該會出現這樣的路徑,如果 git 被安裝在別的地方,可自行變通
此外,不管使用那個版本的 Git backend,都必須設定自己的名字與 email,這兩項資訊在 Git 中是相當必要的
產生 ssh key
由於我們打算運用 putty 來連線,所以要產生專門給 putty 用的 ssh key,這跟一般 Linux 上在用的 OpenSSH 的 private key 格式是不同的。
打開 Puttygen
按下 Generate 即可自動產生一把 key,有趣的是他會要求你移動滑鼠來產生亂數,用以生成這把 key。(在 Linux 上用 ssh-keygen 就不用這樣,是為了好玩還是 windows 沒有亂數產生器啊?)
邊動滑鼠就可以看到進度邊跑
產生出來的 key,Puttygen 會幫你把 public key 顯示出來,可以自定 comment,並利用 Save public key 將其輸出。這把 public key 就是用來提供給 git server 管理者用的身分憑證。
如果事前已經有在其他地方產生過 OpenSSH 格式的 private key,可以透過上方選單中的 Conversions -> Import 來匯入,或是用 Load 的功能也可以匯入其他格式的 ssh key。匯入後跟剛產生一把新的狀況是一樣的,可以繼續下面的步驟。
接下來就可以利用 Save private key 來匯出跟那把 public key 對應的 private key 了 (好拗口)。要特別注意的是,這把 private key (相當於密碼) 不可以弄丟,也不可以洩漏。萬一弄丟,那對應的 public key 也就沒辦法使用了,如果洩漏的話則有身分被盜用的危險!要注意!(就相當於密碼不能忘記也不可以洩漏一樣)
為了更好的安全性,建議輸入 passphrase 保護這把 private key。如果設定了 passphrase,則每次使用到這把 key 的時候都得輸入 passphrase。有些人會覺得奇怪,這樣跟直接用密碼登入有什麼不一樣呢?最大的不同就是,密碼登入是利用密碼作為憑證,有密碼的人就可以登入。透過 key 登入是利用 key 作為憑證,別人拿不到 key 就沒辦法盜用身分 (除非對方有很強大的運算能力,這不在一般討論範圍內),而 passphrase 是用來保護 key 沒辦法被盜用的措施,此舉可達成雙因素認證,比密碼認證更安全!(有個說法是,沒有用 passphrase 的 key 就跟把密碼存成文字檔放在電腦裡一樣)
如果沒有輸入 passphrase,會跳出警告。
可以利用 Pageant 幫我們管理 ssh key (因為一個人可能同時有很多把 key)
按下 Add Key
選擇之前做好的 ppk 格式的 key
這樣就匯入一把 ppk 格式的 ssh key 了
初步使用以確定設定正常
Git clone 看看
輸入 URL,雖然我搞不太清楚他的格式,不過似乎 ssh 不用寫 ssh://
,git://
之類的才需要特別寫
這個例子裡,我用另一台虛擬機器(192.168.2.12),以 gitolite 架了一個 git server,如果是使用別人提供的服務,請洽詢系統管理員提供「帳號」、「主機位址」跟「repo 名稱」。底下的 Load Putty Key 也可以用來載入 ssh key,跟之前在 Pageant 上做的有一樣的效果。
由於是第一次連到此主機,會跳出警告。請跟您的系統管理員確認主機的 host key fingerprint,如果跟畫面中「ssh-rsa 2048 21:89:3a:38:……」位置所顯示的 fingerprint 顯示的不同 (你看到的會跟圖上不一樣),請不要連線,你可能已經遭受某種網路攻擊
之前在製作 private key 的時候有用 passphrase 進行保護的話,會在這時候請你輸入
飛天烏龜克隆中
結束後,就可以在目標目錄中看到 clone 回來的東西,也就確定我們的安裝是正常的。
對大部分人來說,使用 WinGit + TortoiseGit 就沒問題了,除非是需要進行 git 本身的開發才需要 checkout git source code。至於我個人實在很不能接受複雜的 TortoiseGit,使用 WinGit (Git Bash) 最符合我的習慣,偶爾可以透過 Git GUI 作為輔助吧。
]]>error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
在這個例子中,我們的程式找不到 libiconv.so.2
這個 dynamic library。那麼應該怎麼解決呢?
首先必須找到系統中的 libiconv.so.2
,下面四條指令選一條作就好:
$ locate libiconv.so.2
$ whereis libiconv.so.2
$ find /usr /lib -name libiconv.so.2
$ find / -name libiconv.so.2 2>/dev/null
這時候就可以找出函式庫位置,例如:/usr/local/lib/libiconv.so
萬一沒有找出來的話,就要自行安裝了。這篇文章有教該如何安裝 libiconv,如果是其他函式庫的話可以自行變通。
找到位置之後,應該怎麼做呢?如果我們有 root 權限的話,可以把函式庫所在路徑寫入 /etc/ld.so.conf
,再重新產生 ld 的 cache 即可,如下:
# echo "/usr/local/lib" >> /etc/ld.so.conf # 注意! 要用 >> 而非 >!
# ldconfig
在某些系統中,/etc/ld.so.conf
可能會預設加上 include /etc/ld.so.conf.d/*.conf
這樣的敘述,那們我們也可以把路徑放在那個目錄下:
# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig
這樣一來就可以讓程式順利搜尋到需要的 library 囉!
BUT!! 玩 Linux 最重要的就是這個 BUT!!
如果我們沒有 root 權限的話該怎麼辦呢?這時候只好很可憐的自己搞定了…如果需要自行編譯 library 的話,可以照著類似的步驟做,但是 prefix (也就是安裝位置) 要設定在自己的家目錄下,例如:
$ ./configure --prefix=$HOME/libiconv
但這邊假設系統中已經有 /usr/local/lib/libiconv.so.2
這個檔案,進行以下步驟:
$ echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
原理很簡單,就是透過設定 LD_LIBRARY_PATH
來讓程式找得到需要的 library 檔案。修改後需要重新登入才會生效喔!
但是…基本上還是建議不要用後面這個方法啦,找你的系統管理員協助設定 /etc/ld.so.conf
才是好主意。這裡有篇文章:Why LD_LIBRARY_PATH is bad,專門在討論為什麼不要隨意使用 LD_LIBRARY_PATH
。
/etc/ssh/sshd_config
中,同時,修改設定後別忘了重新載入設定值或重新啟動 sshd。
修改預設 port (可用多行開啟多個 port)
Port <port>
僅監聽特定 ip (適用於多網卡/多 IP 的情形)
ListenAddress 192.168.1.10
禁止 root 登入
PermitRootlogin no
管理者必須先以個人帳號登入,再 su 成 root,或利用 sudo 工作。
禁止使用空密碼登入
PermitEmptyPasswords no
僅允許或拒絕特定帳號或群組登入
AllowUsers <user1> <user2> <user3>
AllowGroups <group>
DenyUsers *
DenyGroups no-ssh
根據實驗,對於同一帳號而言,如果同時 Allow 跟 Deny 的話,結果會是 Deny 的。
廢除密碼登錄,強迫使用 RSA/DSA 驗證
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no
並確保 user 的 ~/.ssh
權限為 700
,同時將該 user 的 public key 加入其 ~/.ssh/authorized_keys
中。Public key 的產生方式可搜尋 ssh-keygen
。
僅允許 SSHv2
Protocol 2
限制特定使用者、群組、主機或位址的登入行為,這裡以限制 somebody
與 handsomebody
不可使用密碼登入為例
Match User somebody,handsomebody
PasswordAuthentication no
但是要怎麼結束 Match block?我只找到有資料說「In sshd_config, Match blocks must be located at the end of the file.」,如果真是這樣,那就只好認了。
使用 TCP wrappers 限制來源 IP
# /etc/hosts.deny
sshd: ALL
# /etc/hosts.allow
sshd: 192.168.1 1.2.3.4 # 僅允許 192.168.1.* 與 1.2.3.4 連線
使用 iptables 限制來源 IP
# iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP
設定會立即生效,但若希望重開機後還能保存,需要手動儲存 iptables 的設定。
時間鎖定 (這段直接引用並稍微修改原作者的文字,有空再消化整理)
你可以使用不同的 iptables 參數來限制到 SSH 服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用
/second
、/minute
、/hour
或/day
開關。
第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問 SSH 服務,這樣每個用戶在一分鐘內只能嘗試一次登錄# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
第二個例子,設置 iptables 只允許主機 193.180.177.13 連接到 SSH 服務,在嘗試三次失敗登錄後,iptables 允許該主機每分鐘嘗試一次登錄
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT # iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP
檢查相關檔案權限,不安全則不允許登入
StrictModes yes
某些相關檔案權限設定若有錯誤時,可能造成安全性風險。如使用者的 ~/.ssh/authorized_keys 權限若為 666,可能造成其他人可以盜用帳號。
自訂使用者登入時顯示的 banner (話說這跟安全性有什麼關係…? 大概可以用社交方式嚇跑壞人吧…= =a)
Banner /etc/ssh/banner # 任意文字檔
限制 su/sudo 名單
# vi /etc/pam.d/su
auth required /lib/security/$ISA/pam_wheel.so use_uid
# visudo
%wheel ALL = (ALL) ALL
# gpasswd -a user1 wheel
限制 ssh 使用者名單
# vi /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail
# echo USERNAME >> /etc/ssh_users
為什麼叫做「偽 - git server」呢?因為他不是真的跑起來一支 daemon 去負責 git 的 access,像是 gitolite 或是 gitosis 那樣。(事實上我也不知道該怎麼把那些東西架起來XD)
由於 git 可以透過 ssh protocol 來 access,當然要善用這點!
以下我分為單人各自使用與多人共用來講:
這算是簡單的應用了,只要你有一台工作站的 ssh 帳號,而且工作站上有 git (好吧,我承認我不曉得 minimal requirement 是什麼,也許是 git-shell 吧?) 的話,就可以這樣用,相當簡單!
首先假設遠端 server/workstation 叫做 Remote,網址是 example.com,我在這台機器上的帳號為 crboy,家目錄是 /home/crboy。相當單純而常見的配置。另外本機叫做 PC,其他相同。
那麼我們想要開始一個新專案可以這麼做:(注意主機名稱)
crboy@Remote:~$ mkdir my_project.git # 建立專案 repo 的目錄
crboy@Remote:~$ cd my_project.git # 進去該目錄
crboy@Remote:~/my_project.git$ git init --bare # 初始化這個目錄為「純repo」(這是我自己的說法,應該是不太通用,記得 bare repository 比較好)
Initialized empty Git repository in /home/crboy/my_project.git/
crboy@Remote:~/my_project.git$ ls # 只是看看底下產生了什麼
branches config description HEAD hooks info objects refs
crboy@Remote:~/my_project.git$
回到本機上
crboy@PC:~$ git clone ssh://example.com/home/crboy/my_project.git # 把剛剛產生的空 repo 給 clone 回來,由於是空的,會收到警告
Cloning into my_project...warning: You appear to have cloned an empty repository.
crboy@PC:~$ cd my_project
crboy@PC:~/my_project$ vim README # 隨便寫點東西吧
....... # 這邊就不說了,基本的 git 操作,總之你就 commit 一些東西就對了
crboy@PC:~/my_project$ git push origin master # 第一次 push 要指定遠端主機名稱還有 branch,之後直接 git push 即可
Counting objects: 3, done
Writing objects: 100% (3/3), 218 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://example.com/home/crboy/my_project.git
* [new branch] master -> master
crboy@PC:~/my_project$
去遠端主機上看看
crboy@Remote:~/my_project.git$ git log # 應該會看到你的 log 唷!!
commit cbaf3fe2ab3bb5477a8f05ff79512dd6930e6177
Author: CrBoy <email@is.hidden>
Date: Fri Mar 23 02:41:52 2012 +0800
Initial commit
crboy@Remote:~/my_project.git$
成功了!
那麼,如果是已經有一個現有的 git repository,想要把他丟到遠端去呢?我是透過 git-remote 來幫忙。首先我們假設遠端已經開好一個空的 repository 了,名字跟剛剛一樣。在本機我們這麼做:
crboy@PC:~$ cd existing_project
crboy@PC:~/existing_project$ git remote add origin ssh://example.com/home/crboy/my_project.git # 加入一台遠端主機,名字為 origin
crboy@PC:~/existing_project$ git push origin master # push 的方式跟之前一樣
Counting objects: 3, done.
Writing objects: 100% (3/3), 218 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://example.com/home/crboy/my_project.git
* [new branch] master -> master
crboy@PC:~/existing_project$
另外順便提一下,因為剛剛在測試的時候耍蠢,收到以下這個訊息:
fatal: '/home/crboy/my_project.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
如果你跟我一樣,請你不要驚慌,因為這只是你忘記把遠端 repo 的那個目錄 initialize 了…..XD
有沒有發現上面我根本沒有提到要安裝什麼東西,還是要架什麼 server?因為他真的不需要….只要本來 ssh 是會通的,git 可以用,那上面的動作就都沒問題了(吧XD)。
但是,有時候我們還是得跟別人合作 project 呀!如果有特殊考量,不能用 Github 或是 bitbucket.org 這類服務的話,又該怎麼辦呢?我這邊有個不怎麼完美的作法,但至少是堪用了….
多人要共用就複雜多了,因為牽扯到權限問題。本來以前的我很天真的要 partner 直接 clone 我的 repo 就好,結果後來要 push 的時候才發現他沒有 writing 權限,沒辦法 push 啊啊啊啊XD 於是乎,我只好把我的 repo,裡面所有檔案的 group 都改成對方的 group,然後再把權限加上 g+w (chmod -R g+w
結果過沒多久,又發現出包了啊XDDDD 檢查之後才發現,他新增的一些檔案,owner 會是他,所以我沒辦法改寫,我新增的檔案, group 還是我自己,所以他還是不能 push。雖然可以一直狂修權限,但是這根本就是比水溝還髒的解法= =
於是乎,我去想辦法解決這個問題。
本來是想架 server 的,不過後來忘記在哪裡看到這個技巧,覺得很方便,又不用多開 daemon,就採用了!運作上還不錯,缺點大概是每次設定上比較麻煩,但是這可以寫支 script 來處理就是XD (根本就是抗拒接受更完整的方案)
這個技巧,說穿了很簡單。就是「建立公用帳號,並讓每個人都透過公用帳號來 push/pull」。哇靠,這樣不是很不安全嗎? CrBoy 你這個惡魔怎麼可以介紹這種鳥方法!呃….各位先冷靜,我再說明得詳細一點。
這個方法要:
大概這樣吧…..如果對於 ssh-key 沒有概念的話,呃…可能要請你看看網路上的其他文章了…很簡單的,連我都會 :)
因為我實在懶得重做一次了,所以請各位看倌照著上面的提示做吧!只要對 linux 跟 ssh 有點概念跟使用經驗的話,應該是沒問題的!做完之後,就可以在 git 這個帳號的家目錄底下建立 repo 了,要建幾個都可以XD。至於 clone 或是 push/pull 的方法,都跟上面單人使用的時候類似,唯一不同的是多人都可以存取同一個 repo 而且不會發生鬧鬼的問題唷!另外補充一下,連線的時候要指定 username 為 git 唷~當然 ssh 的 key 也得設定好才行!
但這個方法是有缺點的,其中幾個很明顯的缺點,如:
所以這個 solution 只適合用在小型團隊,很少開專案或是加減人的狀況囉!
對了,抱怨一下,我實在受不了 blogger 寫技術文章真的有夠麻煩…..快崩潰了= =
]]>下面是來自 Commandlinefu 網站由用戶投票表決出的 10 個最酷的 Linux 單行指令。
1. sudo !!
以 root 帳戶執行上一道指令。
2. python -m SimpleHTTPServer
利用 Python 建立一個簡單的 Web 伺服器,可透過 http://$HOSTNAME:8000
瀏覽。
3. :w !sudo tee %
在 vim 中無需權限儲存編輯的文件。
4. cd -
更改到上一次瀏覽的目錄。
5. ^foo^bar
將上一道指令中的 foo 替換為 bar,並執行。
6. cp filename{,.bak}
快速備份或複製文件。
7. mtr google.com
traceroute
+ ping
。
8. !whatever:p
搜尋命令歷史,但不執行。
9. ssh-copy-id user@host
將 ssh keys 複製到 user@host
以啟用無密碼 SSH 登錄。
10. ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
把 Linux 桌面錄製為影片。