有人用過Git來做程式碼管理嗎?
@ 2011-4-19 04:06 PM之前都是用svn…但git可以分散式管理…也就是commit,log等都可以離線進行。
而且分支功能蠻強的…有朋友用過嗎?請分享一下經驗~
==short-cut==
有圖有真相
Git+ssh @centos 安裝步驟+Windows client
TortoiseGit (windows client)
Mac Git Client
31 評論
http://zh-tw.whygitisbetterthanx.com/
這個是不錯的參考資訊。
Git 是存完整的檔案 snapshot,不像 CVS SVN 只記憶與上一版的差別。
所以不管是從目前所在的 HEAD,還是很久之前的,都能夠很快切換到該版本。
不過並不會因為存 snapshot 而造成使用的空間大幅增加,因為它有很好的物件管理。
假設某個檔案完全沒有更動,那物件庫中只需要存一份即可,不需要每一個版本都存一份。
當未壓縮的物件的大小 or 數量(詳細規則不清楚),Git 會自動將這些物件壓縮打包起來。
也可以手動執行此動作。
記得有人用過 KDE 做過類似的比較,Git需要的空間遠低於 svn。
Git 不會對空目錄做版本控制,不像 svn 允許空目錄的存在。
寫的不好的 build system 可能需要稍做修改,檢查及處理此情況。
不過因為是分散式管理的關係,同一筆修改,有可能以不同的 SHA1 ID 現身(如:被rebase過或用 git commit --amend之類的方法重新改寫commit)。 如果是已上傳的 commit,就不要再去改它。 不然屆時可能會很困擾。
雖然 merge 能力很強大,會自行尋找要合併的分支的共同祖先,再根據這兩個分支與該祖先的差異,進行合併的動作。(聽說很來 svn 也跟進提供此功能)。 不過也曾經看過在複雜的條件下,合併出一個怪物。(出現重複的資料)
Git 1.7 在 recursive 合併方式新增 subtree 選項,可以將別的 Git repo. 合併到我們的 Git repo. 的特定子目錄下。
早期版本可以透過 submodule 來做。 不過該子目錄本地端也需要時常更新的話,用 submodule 有點煩人。
儘量不要放像文字檔類型且檔案又很大的檔案。 看過數次 Git 在處理這些檔案時,不知道在忙什麼,放1~2個小時都沒反應。 不過工作目錄其實已經都處理好了,按 Ctrl + C 中斷後也沒發生什麼事。
Git 本身的 protocol (git://),速度還蠻快的。 不過個人感覺,在網路狀況佷糟的環境下,似乎會有些問題。 另外就是,有些公司網路會設限,用 http:// 可能比較好。(雖然速度慢了些)
Git 支援 svn,可以本地端修改、commit後,確認後可以再上傳到 svn server。 只不過醬子用時要留意 svn 只支援 linear 的 history。
有時程式改一改後,要上傳的程式碼,其實包含兩種以上功能。 如果說想儘量保持 atomic commit ,一定要分開上傳的話,CVS 或 svn 大概都要把檔案備份後,先去掉其它功能後上傳......。 光想到醬子就不想做了。
Git 可以用 git add -p 方式,以一小段一小段詢問使用者是否要上傳。 若切出來的程式仍不夠清楚的話,還可以選擇編輯功能,只上傳該小段內特定一小部份程式。工作目錄下的檔案並不會被影響,所以不需要做額外的備份。
註:git add -p 若切出來的程式仍不夠小的話,“不建議”選用縮小 hunk 方式。 因為有可能會造成上傳的程式碼與預期不符。(例:程式碼內有很多類似的小段程式碼,若 hunk 切的太小,易造成誤判)
大致上是醬子,雖然用的時候有一些問題。 不過比起 CVS 開個分支要花 15 分鐘、svn 會生出一堆 .svn 目錄,然後放一堆近似檔案,搜尋前還得先排除掉。 我還是會用 Git 來做管理。
[miholee 在 2011-4-19 10:57 PM 作了最後編輯]
發佈者 : miholee
@ 2011-4-19 10:46 PM
非常感謝miholee兄的指教...
熊小也剛架了git在嘗試中...只看了一些很基本的documentation就可以操作...個人認為git的指令蠻直觀的...不困難.
我是用ssh來存取git...感覺也蠻快的...而且也可以限制用戶...也是git與http外另一個選擇
剛於github申請了帳號...他的git web介面不錯...不過github是closed source...
miholee兄有將git整合到trac, redmine那些web project management系統嗎?
還有就是miholee兄要不要考慮寫篇教學... 正所謂教學雙長...
發佈者 : Vic
@ 2011-4-19 11:16 PM
用 ssh 的話,而且有不同的使用者帳號的話要注意權限。
印象中預設的權限是只有建立的使用者才有寫入的權限。
醬子會發生什麼問題哩?
比如說 git push 了一個物件,SHA ID 是 ac 開頭,那麼 origin 的 .git/objects 會出現一個名為 ac 的目錄,權限有可能是該使用者才能寫入的。
下一次,另一個使用者也 push 一個 ID 是 ac 開頭的物件時,會被拒絕,因為沒有寫入權限。
之前是在該 origin git repo. 用 git init --shared=XXX 修改權限(請參考 git init --help)
或者也可以參考 Pro Git 這本免費的電子書,用 gitosis 或 gitolite 架設。
醬子大家的 ssh 帳號都是用無法登入的 gitosis 或 gitolite。 實際身份以及讀寫的權限再依據各人的 SSH public key 而定。其實就跟 GitHub, Gitorious 一樣,只不過是以修改文字設定檔來做 SSH key 的管理。
gitosis 只能做到是否可讀、寫特定專案。
gitolite 可做到限制分支、打標籤的權限。
網路上有個 git-completion.bash script,可簡化一些操作及幫助使用者更容易瞭解目前 git repo. 的狀態。
如自動補上命令、分支等......
trac 的整合,印象中是自己包一個 trac-git-plugin RPM,安裝後根據網頁說明,做些設定。
如果要做到 commit 時,自動 close issue 的話,要把 trac 網頁提供的 script 放到 git repo。
這我自己也沒在用,因為 trac 後來被我淘汰了,沒有用多久。
redmine 是前一陣子才開始用的。印象中只要指向 bare git repo. 就可以了,權限注意一下就好,不需要特別的設定。個人猜測,將它指向一般的 git repo. 的 .git 目錄,應該也可以。 還沒特別試過就是了。
剛設定完一段時間,redmine會在忙著處理,要等一陣子。 網頁有教如何關閉此功能。(細節忘了)
Git 網站的 Documentation 提到的 ProGit 及 Git Internals 還不錯。另外幾本就沒看過了(當年這幾本都沒電子書 )
至於教學的話還是別寫了,很久沒溫習 Git 的文件,很多東西都忘了,只記得平時用的零碎細節。
而且大部份也都是參考 Pro Git 學的。
[miholee 在 2011-4-19 11:59 PM 作了最後編輯]
發佈者 : miholee
@ 2011-4-19 11:50 PM
有關ssh的部份...不知道是否將使用者都放到同一group...e.g. developer..來解決權限問題?
不過等我也看看gitolite的資料~ 謝謝介紹~
redmine應該不錯用是吧? 我也想架來用用...不過要先架好RoR~ 這我真的不熟了~
anyway...謝謝miholee兄的經驗分享~
發佈者 : Vic
@ 2011-4-20 01:03 AM
redmine我在自己電腦上架不起來…原因好像是RoR的某樣東西的版本太新
Heroku又看不懂,需要花點時間研究…
要不然很想用redmine來管看看程式碼(code review)…
---
除了github,springloops似乎也不錯?
[Kcars 在 2011-4-20 08:01 PM 作了最後編輯]
發佈者 : Kcars
@ 2011-4-20 08:00 PM
沒錯…的確是這樣…必須要用指定版本。
對應最新的版本1.1.2 (2011-03-07)
Supported Ruby: ruby 1.8.6, 1.8.7
Rails version: Rails 2.3.11
Rack version:Rack 1.1.0
Notes:
Ruby 1.9 is not supported yet. You have to use Ruby 1.8.x as stated above.
RubyGems 1.3.1 or higher is required (Rails 2.3.5 will fail with RubyGems 1.5.0 and later, stick to previous versions of RubyGems)
Rake 0.8.3 or higher is required
Rack 1.0.1 is required. If you don't have this exact version, database migration would fail.
I18n 0.4.2 is required for Redmine >= 1.0.5
source: http://www.redmine.org/projects/redmine/wiki/RedmineInstall
我試了,可以安裝成功。
樣子看上去不錯~ 現在是2.0 beta...等它到了正式版再試試~
發佈者 : Vic @ 2011-4-20 09:23 PM
有關ssh的部份...不知道是否將使用者都放到同一group...e.g. developer..來解決權限問題?
redmine應該不錯用是吧? 我也想架來用用...不過要先架好RoR~ 這我真的不熟了~
anyway...謝謝miholee兄的經驗分享~
公司那邊我是將所有的人加入同一個群組,
將共用的 git repo. (我們採用集中管理的流程),設為該群組可讀寫(修改己存在的檔案/目錄權限);
然後再跑過 git init --bare --shared=group (這樣子新建立的目錄,就會是同一個群組都可寫入的。)
至於每個人從人共用的 git repo. clone 到自已電腦的則不管,用預設的就好了。
redmine還在摸索中,感覺上還不錯。原生支援 Git、甘特圖、多個專案。
比較討厭的是有幾個元件需要用特定版本,不過也不致於說很難弄出來。
PS: 我是為了 trac 的甘特圖外掛看起來很醜、需要人工輸入年月日,無法用日曆點選。 才淘汰 trac 的。
[miholee 在 2011-5-8 10:19 PM 作了最後編輯]
發佈者 : miholee @ 2011-4-20 11:12 PM
要裝remine 可以試試看這個 http://bitnami.org/stack/redmine
BitNami Redmine Stack greatly simplifies the deployment of Redmine and its required dependencies. It can be deployed using a native installer, as a virtual machine, in the cloud or as a module over an already installed infrastructure Stack.
他會將所需要用到的所有東西 apache redmine ruby.. 等等放在同一資料夾而不是安裝到系統,所以不會有軟體版本的問題,建議使用看看。
發佈者 : qoowater
@ 2011-4-20 11:34 PM
謝謝分享...我想也是這樣...
nice...剛看了一下~ 除了qoowater兄提到的1)installer(適用於windows, linux & mac)外....他還有2)適用於VMWare or VirtualBox image(也就是linux+redmine整合版)....再加3)cloud(e.g. Amazon EC2)的版本...
發佈者 : Vic @ 2011-4-21 11:01 AM
我將TWed2k的source用Git來管理…感覺很棒。剛才取消鮮花系統的推文效果…並將修改commit了。
很好玩呢~ 有圖有真相
發佈者 : Vic
@ 2011-5-1 05:45 PM
再加一張…慢慢用下去…真的非常好用呢!
特別是可以將所做的事都記錄下來…很方便。
我的做法是多commit…就算只有一個改動也commit…最重要是commit的內容統一。反正也用不了多少資源。
另外,git的分支(branch)也很好用…當我們有一個新的想法想嘗試…又不想影響本來(master)的程式…就可以建一個分支…
待功能完善完…再加到master上…
如果大家有寫程式…真的非常推薦git…很好用呢。
以下是TWed2k code git log
發佈者 : Vic
@ 2011-5-10 08:59 PM
可以請問一下看 git log 這個 windows client 是什麼tool呢?
發佈者 : jfhsu
@ 2011-5-12 10:23 PM
TortoiseGit (它有整個git command的gui…不只是git log)
>>> http://code.google.com/p/tortoisegit/
Tortoise還有CVS, SVN, Mercuria的windows client...
CVS
>>> http://www.tortoisecvs.org/
SVN
>>> http://tortoisesvn.tigris.org/
Mercuria
>>> http://tortoisehg.bitbucket.org/download/windows.html#win32
發佈者 : Vic
@ 2011-5-13 12:29 AM
請問一下熊小
最後是用那一個架
最近剛好沒工作有空閒
也想來測試一下 XD
發佈者 : 陽だまり
@ 2011-5-13 06:56 PM
我的架構是Git+ssh
以下是我在centos的安裝步驟
====建立git server==========
1. 需要先添加EPEL(Extra Packages for Enterprise Linux) repository:
2. 安裝git
yum install git
設定Git用戶
git config --global user.name "yourname"
git config --global user.email "yourname@gmail.com"
新建Repository,假如project已壓縮為tarball檔(projectA.tar.gz)
tar xzf projectA.tar.gz
cd projectA
git init
git add . #記錄project全部檔案
git commit -m 'init projectA' #第一次commit,git會將上一步add的檔案作記錄
產生git bare source…也就是讓別人clone的repo
cd /home
mkdir git
cd /home/git
git clone --bare ./projectA projectA.repo.git
完成以上的步驟,就是已經建立了git server…別人可以clone source了。
Git+ssh的缺點有
1. git client用戶管理不方便…除非都用單一用戶來push/pull source...否則每一個client都需要到server新增一名用戶,而且要將他們都放進同一group內。否則push時會有檔案權限的問題。
2. (忽然想不到。想到再補)
===以下是client的操作====
在另一台linux電腦上checkout(git叫clone)源代碼
git clone ssh://{user}@{git server}:{ssh port}/home/git/projectA.repo.git
{user}是git server主機內的用戶…也可以新增git用戶…如果只允許用git…不能登入shell…請用以下方法
#限制用戶只可以用Git(不容許shell access),使用git-shell為login shell
sudo vi /etc/passwd
{user}:{group}:1000:1000::/home/{user}:/bin/sh
{user}:{group}:1000:1000::/home/{user}:/usr/bin/git-shell
Windows下的方法,有GUI可用,
先下載以下2個程式並安裝
1. msysgit
http://code.google.com/p/msysgit/
2. TortoiseGit
http://code.google.com/p/tortoisegit/
先下載並安裝msysgit,完成後安裝TortoiseGit
第一次使用TortoiseGit時,指定git.exe(於msysgit/bin)的存放資料夾
TortoiseGit的使用這裡就不說…主要的就是Git clone, Git Sync, Git log那幾個…試試就知道。
另外不想每次push/pull都要打密碼…可以public key(e.g. id_rsa.pub) 加到上面{user}的authorized_keys
cat /tmp/id_rsa.pub >> /home/{user}/.ssh/authorized_keys
TortoiseGit有帶一個叫PuttyGen的程式可用來產生public key
熊小也是第一次架…如果上面有任何不清楚or有錯誤的地方…請指教。
發佈者 : Vic @ 2011-5-13 09:53 PM
| ||||||
可打印版本 | 推薦給朋友 | 評分 |