RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [其他] 有人用過Git來做程式碼管理嗎?   字型大小:||| 
  本主題被作者加入到他/她的 Blog 中  
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#1 : 2011-4-19 10:46 PM     全部回覆 引言回覆

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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#2 : 2011-4-19 11:50 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#3 : 2011-4-20 11:12 PM     全部回覆 引言回覆


引用:
Vic寫到:
有關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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#4 : 2011-5-14 09:16 PM     全部回覆 引言回覆


引用:
Vic寫到:
新建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了。


現在一些軟體原始碼內也會附上 .gitignore,有時在設置git repo.時會因此遺漏一些檔案。如:Linux kernel、redmine。
以 2.6.22 Linux kernel 來說,它的 .gitignore 會忽略檔名是 . 開頭的所有檔案。
那麼用git add . ; git commit 做出來的git repo.,實際上不會有.gitignore, .mailmap 檔案。
建議建好 git repo. 後,再clone一份出來,檢查一下是否有遺漏檔案。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#5 : 2011-5-15 03:46 PM     全部回覆 引言回覆

哈,我也有在用Git備份wine安裝的檔案。
至於整台主機,要小心機密的檔案外流唄。而且,每次更新套件後,多多少少會有一堆新檔案等者加入Git repo。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
miholee
青銅驢友
等級: 11等級: 11等級: 11等級: 11


今日心情

 . 積分: 347
 . 文章: 593
 . 收花: 2605 支
 . 送花: 2182 支
 . 比例: 0.84
 . 在線: 1572 小時
 . 瀏覽: 50899 頁
 . 註冊: 7048
 . 失蹤: 8
 . Taibei
#6 : 2011-6-7 11:53 PM     全部回覆 引言回覆

以前在看ProGit時有看到gitolite支援gitweb。不過我自己只有用gitosis及SSH兩種方式,還沒用過這一套。平時也都是git、tig、gitk交叉使用。很少用Web介面。

http://progit.org/book/ch4-8.html

Gitweb support: Gitolite supports gitweb in several ways. You can specify which repos are visible via gitweb. You can set the “owner” and “description” for gitweb from the gitolite config file. Gitweb has a mechanism for you to implement access control based on HTTP authentication, so you can make it use the “compiled” config file that gitolite produces, which means the same access control rules (for read access) apply for gitweb and gitolite.

我覺得 submodule 用起來不是很順手,尤其是 submodule 無法獨立開發時。
若要修改 submodule 內資料,記得先開分支再做修改。不然哪天git submodule update一下,就準備用reflog找遺失的commit了。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-4-25 11:59 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.024546 second(s), 7 queries , Qzip disabled