原文 http://zengrong.net/post/1722.htmhtml
2012-12-26更新:在TortoiseGit中使用SSH host
2012-12-30更新:在安裝的時候選擇TortoiseGit使用的SSH客戶端linux
注意: 本文不講解任何關於Git提交、合併等等使用細節和語法,只記錄做者在使用Git相關工具中碰到的問題和選擇的經驗。本文只是我的意見的集中,不表明適合全部人。若是你是 「被慣壞了的那批」,請不要介意。:-)git
我一直建議在命令行中使用Git或者SVN。由於這樣可能更加了解他們的工做方式,也不容易遺漏重要的問題和提醒。github
在Windows習慣的驅使下,大多數人是不會看彈出的對話框中有什麼信息的,通常都是直接關掉。可是,版本庫給咱們的提示信息都是很是重要的,有的是衝突,有的是提交失敗,等等,這些都被略過了。編程
我碰到的關於版本庫使用問題主要包括下面這些:windows
其實若是在命令行中使用Git或者SVN,以上的問題應該都不會存在。由於命令行會事無鉅細的給咱們提示,尤爲是Git的命令行,會很是聰明的猜想咱們的意圖並給咱們提示。
使用者要正確的使用命令行,就必須去仔細閱讀版本庫的文檔。這樣就能進一步瞭解版本庫的工做原理,減小在使用中的錯誤。緩存
另外,Git的不少功能,尤爲是高級功能,只有命令行能實現。bash
但並不是全部程序猿都願意使用命令行工具,尤爲是被Windows慣壞了的那批。服務器
因此,有了TortoiseSVN和TortoiseGit。session
Git自帶GUI界面。使用 git gui
命令能夠打開它。在這個界面中能夠完成commit、merge、push、pull等等經常使用操做。
使用 gitk
能夠打開查看Git版本庫歷史,在 git gui
中也有菜單能夠打開它。
我的覺得,徹底能夠不用安裝TortoiseGit,對於絕大多數程序猿來講,這個界面已經足夠了。
可是,和「關於命令行」中說的那句話同樣,並不是全部的程序猿都願意使用這個 界面簡陋到醜陋 的工具,尤爲是被TortoiseSVN慣壞了的那批。
那些從SVN轉換過來的程序猿,絕大多數都只用過TortoisSVN。那麼好吧,就讓界面、名字都徹底同樣的TortoiseGit登場吧!
在TortoiseGit官方網站能夠下載到它。有32bit和64bit版本,同時也有中文語言包(但我不建議你安裝)。
安裝完畢以後,若是你沒有安裝過Git,那麼還須要去下載msysGit來安裝。由於TortoiseGit其實只是一個殼,它須要調用Git命令行才能發揮做用。(如今你知道我爲何推薦你用命令行了麼?)
若是你不安裝msysGit,那麼在運行TortoiseGit的時候會彈出這個提示:
爲何TortoiseGit不像TortoiseSVN同樣,把SVN命令行工具集成在安裝包中呢?我猜測是如下幾點緣由:
msysGit的主頁提供了兩個項目:Git for Windows和msysGit,並寫明瞭它們的詳細區別。
我的認爲,Git for Windows適合絕大多數程序猿(又見絕大多數 )。因此,強烈建議安裝Git for Window。
msysGit使用一種很BT也很NB的方式來安裝。先安裝一個最小的MinGW/MSYS系統,而後使用git pull
全部的源碼,調用gcc在本地編譯成可執行文件。
若是本機安裝過Cygwin,那麼在安裝msysGit的時候,cygwin的bin目錄不能位於PATH環境變量中,不然msysGit會拒絕安裝。
其實,若是你不在乎Cygwin提供的Git版本比較老,你徹底能夠不安裝Git for Windows或者msysGit,直接在TortoiseGit中設置Git.exe的路徑爲Cygwin的bin目錄便可。
因爲Cygwin目前的Git版本較老,在運行TortoiseGit的時候你會獲得這個提示:
關於Cygwin、MinGW以及msysGit的關係和選擇,能夠看這篇文章:Cygwin與MinGW,如何選擇?
還有這篇轉載的文章:Msys/MinGW與Cygwin/gcc
我認爲TortoiseGit最大的問題,就是在於它使用ppk密鑰格式,而不是使用OpenSSH密鑰格式。
由於linux系統是默認使用OpenSSH的,因此Git在基於命令行的時候是使用OpenSSH格式的密鑰。
同理,gitolite這種服務器端程序使用的是OpenSSH格式的密鑰。
因此,必須將原有的OpenSSH密鑰轉換成PPK密鑰才能在TortoiseGit中使用。
在安裝TortoiseGit的時候,你能夠選擇使用Putty仍是OpenSSH做爲SSH客戶端。安裝程序中說,Putty和Windows配合得更好。
如何選擇?我分別給出它們的特色:
Putty
OpenSSH
看完上面的特色,若是你仍是選擇了Putty做爲客戶端的話,那麼須要轉換原有的OpenSSH密鑰(若是有的話);
若是你依然義無反顧選擇了OpenSSH做爲客戶端的話,我相信你已經知道如何生成、修改、配置SSH了,看來我也沒必要羅嗦
可使用TortoiseGit自帶的Putty Key Generator來轉換原來的OpenSSH密鑰到ppk格式。
打開該程序,選擇 Conversions->Import Key
命令將OpenSSH 私鑰 導入界面中,而後點擊 Save private key
按鈕將密鑰保存成ppk格式。建議在 Key comment
中輸入說明,不然密鑰多了很難分辨。至於密碼,爲了方即可以不設置。
爲了同時支持服務端和客戶端,咱們能夠在生成一個密鑰的時候,同時生成該密鑰的ppk格式和OpenSSH格式。而每一個密鑰對都包含 公鑰 和 私鑰,兩對一共是4個文件。這樣就能夠知足全部狀況了。
打開Putty Key Generator,選擇 Generator
按鈕,晃動鼠標生成一個密鑰,而後這樣處理:
Save private key
按鈕將密鑰保存成 ppk格式私鑰;Save public key
按鈕將密鑰保存成 ppk格式公鑰;Conversions->Export OpenSSH Key
按鈕將密鑰保存成 OpenSSH格式私鑰;若是使用Putty做爲TortoiseGit的SSH客戶端,那麼就不能使用OpenSSH的 ~/.ssh/config 來定義使用不一樣的端口和密鑰訪問SSH,而是須要使用 PuTTY Session。這篇文章進行了詳細講解:http://zengrong.net/post/1775.htm
Windows(\r\n)、Linux(\n)和MacOS(\r)三個主流系統的換行符各不相同,這樣在跨平臺合做的時候就容易出現換行符的問題。
Git提供了 autocrlf
和 safecrlf
兩個參數來解決這個問題。但這兩個參數若是沒用好,就會影響開發。
例如,出現這種狀況:
A和B兩個開發人員,A使用LF(\n)作換行符,B使用CRLF(\r\n)作換行符,且都沒有開啓 autocrlf
參數,那麼A在遷出B的文件,並使用本身的編輯器打開以後就會發現,雖然沒有對文件作任何修改,但它的狀態是modified。這是因爲A的編輯器自動將B的文件中的全部換行符替換成了(LF),這與版本庫中的(CRLF)不一樣。
讓咱們來看看 autocrlf
參數的做用:
1 2 3 4 5 6 7 8 |
# 簽出時將換行符轉換成CRLF,簽入時轉換回 LF。 git config --global core.autocrlf true #簽出時不轉換換行符,簽入時轉換回 LF git config --global core.autocrlf input #簽出簽入均不轉換 git config --global core.autocrlf false |
這些選項在TorgoiseGit中也能夠設置。
個人建議是在不管在什麼系統下編程,都把全部人的編輯器的換行符模式設置成Unix格式,而後把autocrlf設置成false,這樣一勞永逸。
畢竟除了Windows記事本這類軟件外,已經不多有文本編輯器不支持換行符設置了。
若是你把換行符搞亂了,在一個文件中既包含windows風格的換行符也包含unix風格換行符,那麼 safecrlf
就能夠發揮做用了:
1 2 3 4 5 6 7 8 |
# 拒絕提交包含混合換行符的文件 git config --global core.safecrlf true # 容許提交包含混合換行符的文件 git config --global core.safecrlf false # 提交包含混合換行符的文件時候給出警示 git config --global core.safecrlf warn |
我在Cygwin下以命令行的形式使用Git,同時也使用TortoiseGit。
在使用TortoiseGit簽出使用cygwin提交的項目時,發現全部的文件權限都改變了:
1 2 3 4 |
$ git diff diff --git a/launch4j/spritesheet_conterver.xml b/launch4j/spritesheet_conterver.xml old mode 100755 new mode 100644 |
這是由於msysgit是一個類Unix模擬器,須要擁有Unix形式的文件訪問權限。而因爲Windows的種種限制,信息不能復原,從而致使原來的755成644了。
解決方法:
1 2 |
git config --global core.filemode false git config core.filemode false |
這個選擇的在TortoiseGit中沒有界面來設置,只能用命令行或者手動修改git配置文件。