1,當(dāng)選擇了一段文本后 (如一個(gè)變量名)在整個(gè)類中用到該文本的地方都高亮顯示
Eclipse工具欄上有個(gè)類似鋼筆的圖標(biāo),按下去就可以了。
2,當(dāng)想要修改一個(gè)變量在類中所有用到的地方時(shí) 如 A a = new A(); 還有很多其它位置用到a 現(xiàn)在想要把a(bǔ) 改為a1
可以選正a后在菜單上選Refactor->Rename 就可以。類中有a 的地方都會(huì)改為a1
作者:caoyinghui1986 發(fā)表于2009-9-4 21:41:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/06a9261120fd9b78cb80c435.html
5.6 其他功能
在這一節(jié)中,我們將介紹幾個(gè)非常有用的Eclipse功能。這些功能有助于您提高CVS和Eclipse的使用效率。
5.6.1 編輯器中的快速差別功能對(duì)CVS的支持
在本書第2章“Eclipse入門”中,您知道編輯
器所支持的快速差別功能可對(duì)文件的添加和修改操作加上注釋。如果您在Workbench | Editor | Quick
Diff首選項(xiàng)頁(yè)面中啟用了Latest CVS
Revision選項(xiàng),那么快速差別功能所添加的文件注釋是在參考CVS中該文件最新版本的基礎(chǔ)之上添加的。在將更改提交到CVS或用CVS中該文件的某
一版本來(lái)替換該文件時(shí),快速差別功能所添加的注釋會(huì)被刪除。
5.6.2 補(bǔ)丁程序:快速而又簡(jiǎn)單地共享更改
補(bǔ)丁程序(patch)是一個(gè)包含了某一資源的資源庫(kù)實(shí)例和該資源的工作空間實(shí)例之間差別的文件。補(bǔ)丁程序可表示出一個(gè)單獨(dú)文件(或完整項(xiàng)目)中的差別。補(bǔ)丁程序允許您共享尚未提交到CVS的更改。有很多原因使得補(bǔ)丁程序非常有用。
● 由于您沒有向CVS提交資源的權(quán)限,所以您需要將該補(bǔ)丁程序發(fā)送給具有資源提交權(quán)限的人,然后再由他向CVS提交資源。
● 您需要為所遇到的問題準(zhǔn)備一個(gè)應(yīng)急修改或臨時(shí)工作空間。
● 在將重要的更改提交到CVS之前,您可能想讓別人對(duì)您的更改進(jìn)行校驗(yàn)。在這種情況下,您可以將補(bǔ)丁程序發(fā)送給校驗(yàn)人以讓他們進(jìn)行測(cè)試。
通過使用快捷菜單Team | Create
Patch…,我們就可以創(chuàng)建補(bǔ)丁文件。該操作會(huì)調(diào)用Create
Patch向?qū)?lái)指導(dǎo)您完成補(bǔ)丁文件的創(chuàng)建。若要應(yīng)用某補(bǔ)丁程序,則使用快捷菜單Team | Apply Patch…。該操作會(huì)調(diào)用Apply
Patch向?qū)?。Eclipse聯(lián)機(jī)文檔Workbench User Guide的Working with patches
一節(jié)中有關(guān)上述兩個(gè)操作的描述非常精彩。
5.6.3 項(xiàng)目集:加快新工作空間
小組支持為工作空間中的項(xiàng)目(一個(gè)或多個(gè))提供了版
本控制信息的封裝功能。該封裝功能被稱為項(xiàng)目集。項(xiàng)目集的目的是從執(zhí)行任務(wù)所需的資源庫(kù)中把需要的全部項(xiàng)目都預(yù)先準(zhǔn)備到一個(gè)工作空間中。在應(yīng)用程序構(gòu)建過
程中可能要用到存在相互依賴關(guān)系的多個(gè)項(xiàng)目。下述操作可能是單調(diào)乏味而又容易產(chǎn)生錯(cuò)誤的:決定所需項(xiàng)目,然后再將這些所需的正確項(xiàng)目從資源庫(kù)中手動(dòng)添加到
工作空間中。項(xiàng)目集是Eclipse的一個(gè)功能單元。資源庫(kù)提供程序可對(duì)是否支持該功能進(jìn)行選擇(很多資源庫(kù)提供程序都會(huì)選擇是)。CVS對(duì)項(xiàng)目集提供了
支持。一個(gè)項(xiàng)目集所封裝的項(xiàng)目可能是由不同資源庫(kù)管理的。
項(xiàng)目集信息包含在一個(gè)文件中。若要?jiǎng)?chuàng)建該項(xiàng)目集信息
文件,則在菜單欄上選擇File | Export | Team Project Set選項(xiàng)。若要使用該項(xiàng)目集信息文件,則在菜單欄上選擇File
| Import | Team Project
Set選項(xiàng)。通過使用Export向?qū)В覀兛梢詫?duì)項(xiàng)目集中所包含的項(xiàng)目進(jìn)行定義。出于通用的考慮,最終的項(xiàng)目集信息文件可被發(fā)送給別人以在CVS中進(jìn)行
導(dǎo)入或維護(hù)。對(duì)于所開發(fā)的應(yīng)用程序來(lái)說(shuō),您可以為其開發(fā)生命周期關(guān)鍵節(jié)點(diǎn)處的快照維護(hù)多個(gè)項(xiàng)目集文件。
在導(dǎo)入過程中,項(xiàng)目集文件中定義的所有項(xiàng)目都被從
CVS中自動(dòng)檢出到您的工作空間中。在導(dǎo)入過程中,一種可能比較穩(wěn)健的做法是禁用自動(dòng)構(gòu)建首選項(xiàng)設(shè)置(Workbench首選項(xiàng)頁(yè)面中的Build
Automatically設(shè)置)。通過禁用Build
Automatically設(shè)置,我們就可以在導(dǎo)入過程中避免編譯和構(gòu)建操作,進(jìn)而加快資源的導(dǎo)入。但在導(dǎo)入操作完成后,請(qǐng)記住要重新啟用該首選項(xiàng)。
5.6.4 斷開項(xiàng)目與CVS的連接或?yàn)轫?xiàng)目重分派一個(gè)CVS資源庫(kù)
通過使用Team |
Disconnect…操作,您可以斷開項(xiàng)目與CVS的連接。在選擇了快捷菜單Team |
Disconnect…后會(huì)出現(xiàn)一個(gè)對(duì)話框。該對(duì)話框會(huì)對(duì)您進(jìn)行詢問,以讓您對(duì)是否保存該項(xiàng)目的CVS元數(shù)據(jù)作出決定。如果選擇了保留該項(xiàng)目的CVS元數(shù)
據(jù),那么通過使用Team | Share
Project…操作,我們就可以將該項(xiàng)目與同一CVS資源庫(kù)進(jìn)行重新連接。如果您刪除了該CVS元數(shù)據(jù),那么可以將該項(xiàng)目共享給其他資源庫(kù)。
作為選擇,如想將項(xiàng)目重新分派給另外一個(gè)CVS資源庫(kù),那么您可以先為該項(xiàng)目打開CVS資源庫(kù)頁(yè)面,然后再選擇Change Sharing…按鈕。該操作與使用Disconnect…以及Share Project…操作在邏輯上等價(jià)。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:58:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/8265f309c5d35bc93ac76334.html
5.5 特殊情況及其處理
這里將給出一些您每天或在軟件開發(fā)周期中可能會(huì)碰到的常見情況,以及如何使用Eclipse來(lái)處理這些情況的建議。某些情況的解決可能需要使用CVS,但通常只使用Eclipse就可以處理它們。
5.5.1 對(duì)項(xiàng)目資源進(jìn)行重命名、移動(dòng)和刪除
●
避免重命名CVS控制之下的項(xiàng)目。如果您這樣做了,那么所做的命名修改只在該項(xiàng)目所處的工作空間中有效。保留在CVS中的仍是該項(xiàng)目的初始名。如果必須修
改項(xiàng)目的名稱,那么您最好先使用Team |
Disconnect…操作來(lái)解除該項(xiàng)目與CVS的關(guān)聯(lián)關(guān)系,然后再對(duì)該項(xiàng)目重命名。事實(shí)上,重命名后的項(xiàng)目會(huì)被看作是新項(xiàng)目。在將重命名后的項(xiàng)目重新連
接到CVS時(shí),您必須像定義任何新項(xiàng)目一樣將該重命名后的項(xiàng)目定義到CVS中。
● 對(duì)文件夾的重命名操作會(huì)導(dǎo)致CVS中出現(xiàn)一個(gè)新文件夾。幸運(yùn)的是,原文件夾中的內(nèi)容會(huì)被移動(dòng)到新文件夾中。如果您啟用了CVS首選項(xiàng)Prune empty directories,那么在從CVS檢出資源后,該舊文件夾將不會(huì)出現(xiàn)在您的工作空間中。
●
如果您將工作空間中的某資源刪除了,那么在向CVS提交了更改后,保存在CVS中的該資源也會(huì)被刪除。要記住的是文件夾決不會(huì)在CVS中刪除。CVS首選
項(xiàng)Prune empty directories使得這些文件夾隱藏在視圖中。默認(rèn)情況下,CVS首選項(xiàng)Prune empty
directories是被啟用的。
● 因?yàn)樾薷目赡軙?huì)涉及多個(gè)項(xiàng)目,所以在進(jìn)行全局修改前,您需要確保工作空間中的所有項(xiàng)目是資源庫(kù)中的最新版本。Java類的重構(gòu)是一個(gè)可能導(dǎo)致工作空間被廣泛修改的操作。項(xiàng)目間的資源移動(dòng)也可能產(chǎn)生這種影響。
● 在CVS透視圖中,項(xiàng)目之間資源移動(dòng)的結(jié)果是:所要移動(dòng)的資源添加到目標(biāo)項(xiàng)目中,而源項(xiàng)目中的該資源會(huì)被刪除。移動(dòng)到目標(biāo)項(xiàng)目中的資源必須被添加到版本控制中。而資源重命名的效果與此相同。
●
在文件被修改后,如果您要執(zhí)行諸如同步等CVS操作,那么我們建議您在項(xiàng)目層次上進(jìn)行同步(即使您的更改可能僅涉及一個(gè)單獨(dú)文件)。例如,如果您對(duì)一個(gè)文
件進(jìn)行了重命名這一CVS的刪除和添加操作,那么在文件層次上的同步將只會(huì)檢測(cè)添加操作而不檢測(cè)刪除操作。而項(xiàng)目層次上的同步則會(huì)對(duì)添加和刪除操作都進(jìn)行
檢測(cè)。
● 在所進(jìn)行的修改涉及整個(gè)應(yīng)用程序的情況下,您應(yīng)該將這次修改通知給自己所在的小組,以避免不必要的沖突。此時(shí),一旦條件滿足,您就應(yīng)該提交修改。沖突的解決可能是冗長(zhǎng)乏味而又難以解決的。
5.5.2 取消修改:使用替換和比較操作
有時(shí),我們都希望事情能夠重新開始。在人的一生中,
這可能不容易。但是對(duì)于Eclipse和CVS來(lái)說(shuō),這要簡(jiǎn)單得多。根據(jù)您的需要,您有多種選擇。在先前的幾章中,您看到了如何使用快捷菜單操作
Replace With和Compare
With用工作空間中的本地歷史記錄來(lái)替換和比較資源。通過使用CVS,您對(duì)資源的替換和比較操作就有了額外的選擇。如果您尚未最終完成某個(gè)修改,而且之
后一段時(shí)間里根本就沒有繼續(xù)這次修改。這種情況下,Compare
With操作可能會(huì)非常有用,它會(huì)使您記起上次停止修改的地方。在使用上述Replace With和Compare
With操作時(shí),您是用來(lái)自HEAD流(或者其他分支/版本、某一個(gè)具體版本)的最新資源來(lái)替換或比較當(dāng)前資源的。
5.5.3 通過建立分支來(lái)進(jìn)行版本維護(hù)和新版本開發(fā)
在小組已經(jīng)交付了您的應(yīng)用程序并準(zhǔn)備開始下一個(gè)版本的開發(fā)工作時(shí),您可能喜歡所有的后續(xù)開發(fā)能在下一版本所指派的特定分支處開始,同時(shí)還要允許先前版本的服務(wù)。這里所給出的就是在Eclipse中可用的一種方法。
●
在包含了最近已完成版本的分支(或HEAD)中,請(qǐng)選擇所有的項(xiàng)目。然后在所選項(xiàng)目上使用Branch…快捷菜單,并輸入該新版本的新分支名。這樣,所選
擇的全部項(xiàng)目以及這些項(xiàng)目的內(nèi)容將用下一個(gè)版本分支名來(lái)標(biāo)記。在CVS
Repositories視圖中,這些項(xiàng)目會(huì)被列在那個(gè)分支名之下。在從那個(gè)分支處將這些項(xiàng)目檢出到您的工作空間之后,接下來(lái)的操作是基于該新版本分支
的。
● 您可重復(fù)上述過程以創(chuàng)建一個(gè)單獨(dú)的維護(hù)分支。該維護(hù)分支獨(dú)立于上面所創(chuàng)建的新版本分支。
●
為了能以維護(hù)分支為基礎(chǔ),在工作空間中對(duì)新版本分支進(jìn)行合適的前向修改,您可以通過使用Compare With | Another Branch
or Version…操作來(lái)確定這兩個(gè)分支之間的差別。在Compare視圖中,您可以手動(dòng)合并從維護(hù)分支到新版本分支的更改。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:56:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/8eab160264428f094afb512b.html
5.4.9 處理同一文件的并發(fā)更新
首先,我們討論一下一個(gè)被建議用來(lái)進(jìn)行修改操作的協(xié)
議。當(dāng)在工作空間中使用資源時(shí),您的操作是獨(dú)立于CVS資源庫(kù)的。因?yàn)榘l(fā)生在資源庫(kù)中的更改可能是在您不知道的情況下發(fā)生的,所以非常重要的一點(diǎn)是,如果
還未檢查資源庫(kù)中是否有更新取代了您的更改,那么您一定不要提交任何更改。Team |
Update…操作會(huì)用資源庫(kù)中那些取代了您的更改的任何更改來(lái)更新項(xiàng)目的本地副本。對(duì)于文本文件(包括Java類)來(lái)說(shuō),Team |
Update…操作會(huì)自動(dòng)對(duì)任何更改進(jìn)行合并(從資源庫(kù)到工作空間),即使這些更改可能造成沖突。在遇到?jīng)_突時(shí),合并操作會(huì)用特定的CVS標(biāo)記文本來(lái)標(biāo)識(shí)
文件中的沖突,以幫助您識(shí)別出沖突行。標(biāo)記文本并不是與任何類型的文件都兼容,例如它可能導(dǎo)致編譯錯(cuò)誤。
Update…
操作是一個(gè)非常強(qiáng)大的操作,我們?cè)诰毩?xí)時(shí)一定要小心。在下面這個(gè)例子中,Pat和Lynn更新了一個(gè)簡(jiǎn)單的文本文件。無(wú)需知道它,它們都對(duì)以“B”和
“C”開始的行進(jìn)行了更新。標(biāo)記文本會(huì)對(duì)沖突的那些行以及引入了沖突的版本號(hào)(1.2)進(jìn)行了標(biāo)識(shí)。對(duì)于一個(gè)帶有眾多沖突的復(fù)雜Java文件來(lái)說(shuō),您可能
很難解決其中的沖突。
A is for apple
<<<<<<< sample.txt
B is for bird (updated by pat
)
C is for crow (updated by pat
)
=======
B is for bobcat (updated by lynn
)
C is for cow (updated by lynn
)
>>>>>>> 1.2
D is for dog
E is for excellent
F is for farm
G is for goat...
Team | Synchronize with
Repository…操作也支持更新,但是該操作不會(huì)自動(dòng)進(jìn)行更新。在執(zhí)行該操作后會(huì)顯示Synchronize視圖,并會(huì)列出工作空間副本和資源庫(kù)最
新資源之間那些不一致的資源。在Synchronize視圖中,您可以對(duì)這些差別進(jìn)行檢查,并決定所要采取的操作。由于Team |
Synchronize with Repository…操作可使您擁有更多的控制權(quán),所以我們建議您使用該操作來(lái)代替Update…操作。
下面總結(jié)一下文件并發(fā)更新的基本規(guī)則:在對(duì)工作空間
中的文件進(jìn)行修改之前,您必須用資源庫(kù)中的所有更改來(lái)更新工作空間中的資源。為了安全起見,此時(shí)請(qǐng)使用Team | Synchronize with
Repository…操作。在Synchronize視圖中,您可執(zhí)行更新操作,還可提交更改,并可協(xié)調(diào)沖突。
5.4.10 使用CVS的Watch/Edit支持以避免對(duì)同一文件的并行更新
CVS
的Watch/Edit支持是Eclipse本身就提供的。如果您同意使用CVS的Watch/Edit支持,那么在提交資源時(shí),您和小組其他成員之間就
可以避免沖突。在啟用了CVS的Watch/Edit支持之后,您的項(xiàng)目小組可以更好地理解在所有具體項(xiàng)目中,當(dāng)前誰(shuí)正更新文件。相反,前面所討論的
CVS Annotate視圖為您所顯示的是先前的更改以及誰(shuí)做的更改。CVS的Watch/Edit支持是在項(xiàng)目層次上被啟用的。如果在Team |
CVS >Watch/Edit的首選項(xiàng)設(shè)置頁(yè)面中選中了Configure projects to use Watch/Edit on
checkout復(fù)選框,那么在項(xiàng)目被檢出時(shí),Watch/Edit支持將被自動(dòng)激活。您也可以通過設(shè)置項(xiàng)目的CVS屬性在受CVS管理的現(xiàn)有項(xiàng)目上啟用
Watch/Edit支持。在CVS的Watch/Edit支持被啟用時(shí),該項(xiàng)目中的文件處于只讀狀態(tài)。此時(shí),如果您在編輯器中打開了某文件后又試圖對(duì)該
文件進(jìn)行修改,那么CVS服務(wù)器會(huì)被詢問。在編輯文件時(shí),如果其他人也正在編輯該文件,那么就會(huì)出現(xiàn)一個(gè)對(duì)話框以通知您小組中其他成員也正在編輯該文件
(見圖5-9)。這時(shí),您可以繼續(xù)對(duì)該文件進(jìn)行編輯,但是在您提交該文件時(shí)需要進(jìn)行沖突管理。在文件被修改時(shí),檢查標(biāo)記修飾符
會(huì)被添加到該文件上。
圖5-9 顯示其他人正在編輯同一文件的對(duì)話框
在項(xiàng)目、文件夾以及文件上執(zhí)行Team |
Show Editors操作后會(huì)打開CVS Editors視圖。CVS
Editors視圖中列出的是所有正在被其他人更新的資源(見圖5-10)。無(wú)論是否處于Watch/Edit的控制之下,您在任何項(xiàng)目及項(xiàng)目資源上都可
以使用Team | Show Editors操作。但是Team | Show
Editors操作只會(huì)對(duì)啟用了Watch/Edit支持的項(xiàng)目資源進(jìn)行標(biāo)識(shí)。
圖5-10 列出了哪個(gè)用戶正在更新文件夾中文件的CVS Editors視圖
您可以使用Team |
Edit操作來(lái)顯式地通知CVS服務(wù)器,讓CVS服務(wù)器知道您想對(duì)文件進(jìn)行更新。您還可以使用Team |
Unedit操作來(lái)通知CVS服務(wù)器,讓CVS服務(wù)器知道您不想再編輯該文件。這樣,您所做的任何更改都會(huì)被從CVS資源庫(kù)中檢出。表5-3給出了有關(guān)這
些操作的信息。在向CVS提交了更改之后,Watch/Edit列表中的資源會(huì)被隱式刪除掉。
Watch/Edit是一個(gè)非常有用的工具。但是該
工具的使用需要遵循一些規(guī)則,并要注意一些考慮事項(xiàng)。首先,如果要使Watch/Edit功能高效,那么小組中的每個(gè)成員都必須在存在潛在沖突的項(xiàng)目中啟
動(dòng)Watch/Edit功能。其次,您必須連接到CVS服務(wù)器上。如果您沒有和CVS服務(wù)器相連,并且想更新一個(gè)文件,那么您將不得不顯式地將該文件的只
讀狀態(tài)(從該文件的屬性頁(yè)面中可獲得該屬性)取消掉。當(dāng)然,該支持現(xiàn)在是折中的。這是因?yàn)?,沒有任何人知道該更新,而且在提交過程中存在潛在的沖突。如果
您刪除了一個(gè)項(xiàng)目并且該項(xiàng)目資源的Watch/Edit首選項(xiàng)設(shè)置沒有被啟用,那么CVS服務(wù)器將不會(huì)被通知,并且CVS服務(wù)器會(huì)繼續(xù)向外報(bào)告您正在對(duì)這
些資源進(jìn)行編輯。如果您的小組計(jì)劃使用Watch/Edit支持,那么明智的做法是小組中所有人都啟用被標(biāo)注為Configure projects
to use Watch/Edit on checkout的CVS Watch/Edit首選項(xiàng)設(shè)置。
5.4.11 恢復(fù)被刪除的文件
有時(shí)候,在文件被刪除并且更改被提交給CVS后,您
可能需要恢復(fù)所刪除的文件。幸運(yùn)的是,CVS不會(huì)將所刪除的文件從該文件所在的資源庫(kù)中移除。您可以使用Team | Restore from
Repository操作來(lái)恢復(fù)所刪除的文件。如果被刪除的文件在資源庫(kù)中存在,那么您將看到一個(gè)對(duì)話框。在該對(duì)話框中,您可以選擇所要恢復(fù)的文件的具體
修訂版(見圖5-11)。而文件的最新修訂版則是一個(gè)對(duì)所刪除文件的引用。這是因?yàn)槲募h除是一個(gè)CVS修訂操作。
圖5-11 顯示可恢復(fù)的被刪除文件的Restore from Repository對(duì)話框
當(dāng)一個(gè)文件被恢復(fù)到工作空間中的時(shí)候,該文件被看作是一個(gè)新文件。在提交該文件之前或提交該文件時(shí),必須將該新文件添加到版本控制中。
5.4.12 其他CVS用戶界面元素
1. Checkout向?qū)?/h4>
在New wizard對(duì)話框中獲得的是CVS向?qū)е械臋z出項(xiàng)目。通常,您會(huì)使用CVS Repositories視圖來(lái)檢出項(xiàng)目。但是,有些CVS資源庫(kù)是不允許被瀏覽的。在這種情況下,檢出向?qū)Э赡芫捅容^有用。但是在這種情況下,您必須預(yù)先知道該項(xiàng)目的名稱。
2. CVS備忘單
若要打開Cheat Sheet Selection對(duì)話框,則選擇Help | Cheat Sheets…命令。對(duì)于CVS任務(wù)來(lái)說(shuō),備忘單用來(lái)為分支和合并操作提供幫助。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:53:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/6d090c22ffe227f5d6cae22b.html
5.4.3 CVS Annotate視圖
CVS
Annotate視圖與CVS Repository Exploring透視圖中的CVS
Repositories視圖使用的是同一界面空間。CVS Annotate視圖用來(lái)標(biāo)識(shí)各版本文件中所添加的新行以及被更改過的行。CVS
Annotate視圖還會(huì)指出做出這次修改的是誰(shuí)。現(xiàn)在您知道是誰(shuí)做出了這些難以解釋的更新,或者是誰(shuí)應(yīng)該對(duì)這些難以解釋的更新負(fù)責(zé)。對(duì)于所選擇的任何版
本來(lái)說(shuō),文件中所添加的新行會(huì)在編輯器中突出顯示(見圖5-4)。若要打開CVS Annotate視圖,則從CVS
Repositories視圖、CVS Resource History視圖的快捷菜單Team中選擇Show
Annotation操作。打開CVS Annotate視圖的一種比較方便的方法是從Navigator透視圖或Package
Explorer視圖中所顯示的某一個(gè)文件上選擇Team | Show Annotation操作。在打開CVS Repository
Exploring透視圖時(shí)會(huì)打開CVS Annotate視圖,CVS Resource
History視圖,并且在編輯器中所打開的文件的版本是最新的。CVS
Annotate視圖中的選擇操作會(huì)將編輯器復(fù)位到被更新的代碼行,并且相應(yīng)的版本會(huì)在CVS Resource
History視圖中突出顯示出來(lái)。相反,如果在編輯器中選擇了一行代碼,那么在CVS Repository
Exploring透視圖的那些視圖中就會(huì)適當(dāng)?shù)貙?duì)所更改的對(duì)象進(jìn)行突出顯示。現(xiàn)在您就可以非常容易地對(duì)任何文本文件的、詳細(xì)的更改歷史信息進(jìn)行檢查。
圖5-4 CVS Repository Exploring透視圖中的CVS Annotate視圖
5.4.4 CVS Resource History視圖
CVS Resource
History視圖可顯示某一具體文件的所有版本的詳細(xì)信息(見圖5-5)。CVS Resource History視圖是CVS
Repository Exploring透視圖的一部分。在CVS
Repositories視圖中先選擇一個(gè)文件,然后再在單擊右鍵所出現(xiàn)的快捷菜單中選擇Show in Resource
History命令,這樣您就可以看到該文件的歷史版本信息。在受CVS控制的項(xiàng)目上單擊鼠標(biāo)右鍵后所出現(xiàn)的Team快捷菜單項(xiàng)中也有Show in
Resource History命令。作為一種查看文件歷史的快速方法,您可以將受CVS控制的工作空間中的某一文件拖放到CVS Resource
History視圖以直接查看該文件的歷史信息。
圖5-5 CVS Resource History視圖
對(duì)于任何被選擇的修訂版本來(lái)說(shuō),與該修訂版本相關(guān)的
分支和版本標(biāo)記,連同該版本的文件被提交到資源庫(kù)時(shí)所提供的注釋,都會(huì)一起顯示在CVS Resource
History視圖的底部(見圖5-5)。通過在CVS Resource
History視圖的下拉菜單中進(jìn)行相應(yīng)選擇,我們可以隱藏該視圖中的“Tags”項(xiàng)和“Comment”項(xiàng)。
文件的歷史記錄可能比較長(zhǎng),這時(shí),您可以使用CVS Resource History視圖工具欄上的Filter History
按鈕來(lái)過濾CVS Resource History視圖。也可以根據(jù)作者、注釋值、日期變化等來(lái)對(duì)CVS Resource History視圖中的顯示內(nèi)容進(jìn)行過濾。CVS Resource History視圖工具欄上的Link with Editor操作
會(huì)使CVS Resource History視圖與當(dāng)前活動(dòng)編輯器(僅對(duì)CVS控制之下的文件)保持同步。
對(duì)于在CVS Resource History視圖中被選擇的那些版本來(lái)說(shuō),您對(duì)它們可以執(zhí)行的操作是依賴于資源是否已被復(fù)制到工作空間而發(fā)生變化的。這些操作被列在表5-2中。
表5-2 CVS Resource History視圖中的操作
操 作
|
描 述
|
Compare
|
該操作會(huì)對(duì)所選的兩個(gè)版本進(jìn)行相互比較
|
Get Contents
|
該操作會(huì)用所選版本的內(nèi)容來(lái)替換該資源的本地工作副本中的內(nèi)容
|
Get Sticky Revision
|
該
操作會(huì)將資源的本地工作副本還原為一個(gè)先前版本。本地副本會(huì)作為資源庫(kù)修訂版,并會(huì)保留相同的版本標(biāo)記。需要指出的是,只有在對(duì)CVS非常熟悉的情況下,
您才可以使用該操作。該操作的后果之一是,除非“sticky
revision”標(biāo)記被移走(直接使用CVS命令),否則您不能提交任何進(jìn)一步的修改。當(dāng)然,您可使用Replace With | Latest
from Repository操作返回到原版本。通常,除非您是一個(gè)熟練的CVS用戶,否則您可能不會(huì)對(duì)“sticky revision”標(biāo)記感興趣
|
Open
|
該操作會(huì)在編輯器中打開所選的修訂版文件。這時(shí),您是不能對(duì)該版本文件作出任何更改的
|
(續(xù)表)
操 作
|
描 述
|
Refresh View
|
該操作會(huì)用CVS資源庫(kù)中的內(nèi)容來(lái)更新CVS Resource History視圖
|
Show Annotation
|
該操作會(huì)使Eclipe切換到CVS Repository Exploring透視圖,并使得CVS Annotate視圖變?yōu)楫?dāng)前焦點(diǎn)以顯示出所選文件的注釋
|
Tag with Existing…
|
該操作會(huì)將已有的資源庫(kù)版本或分支標(biāo)記應(yīng)用到所選的資源上。該操作是一個(gè)特殊的操作。請(qǐng)查看聯(lián)機(jī)幫助中的Moving Version Tags專題以獲得何時(shí)使用該操作的詳細(xì)信息
|
5.4.5 查看CVS命令
Eclipse
Console視圖可顯示出CVS與Eclipse之間的所有的命令和響應(yīng);在您碰到問題的時(shí)候,該視圖是非常有用的。在Eclipse
Console視圖中還顯示了所發(fā)布的供用戶使用的任何Eclipse CVS操作的所有CVS命令。在Team | CVS |
Console首選項(xiàng)頁(yè)面中,您可以對(duì)該控制臺(tái)的外觀和行為進(jìn)行配置。
5.4.6 CVS是如何管理工作空間中項(xiàng)目的
圖5-6顯示了Package
Explorer視圖中一個(gè)處在CVS控制之下的項(xiàng)目。通過觀察圖標(biāo)上的標(biāo)記修飾符以及附加的文字信息,您可以很明顯地看出這一點(diǎn)。只有在啟用了
Workbench | Label Decorations首選項(xiàng)設(shè)置后,Eclipse才會(huì)在Package
Explorer視圖中顯示附加文字信息。對(duì)于那些受版本控制所有資源來(lái)說(shuō),在它們的資源圖標(biāo)上都有一個(gè)很小的磁盤標(biāo)志修飾符
。對(duì)于那些CVS所不知道的、被添加到項(xiàng)目中的文件來(lái)說(shuō),在這些文件的圖標(biāo)中也有一個(gè)很小的標(biāo)志修飾符
。
在如圖5-6所示的Package
Explorer視圖中,緊接著項(xiàng)目名后面的是該項(xiàng)目所屬CVS資源庫(kù)服務(wù)器的名稱(位于方括號(hào)中)。如果該項(xiàng)目是被作為一個(gè)分支部分來(lái)使用的,那么該分
支的名稱也會(huì)被包含在方括號(hào)中。文本修飾符>表明本地資源是一個(gè)傳出更改(outgoing
change),這就意味著該本地資源已經(jīng)在本地修改過,并與CVS中相應(yīng)內(nèi)容不一致。Package
Explorer視圖中受CVS控制的文件夾(直至項(xiàng)目文件夾)也具有這個(gè)特征。資源名后面的圓括號(hào)中所顯示的文本表示的是該資源的文件格式(ASCII
格式或二進(jìn)制格式)。我們知道,對(duì)于ASCII文件來(lái)說(shuō),在CVS文件實(shí)例和本地文件實(shí)例之間的并行修改可被合并。而二進(jìn)制文件只能被替換。
圖5-6 Label Decorations首選項(xiàng)被啟用時(shí)受CVS控制的項(xiàng)目
在Team | CVS | Label Decorations首選項(xiàng)頁(yè)面中,您可以對(duì)CVS標(biāo)簽修飾的表示和規(guī)則進(jìn)行修改。
5.4.7 在Team快捷菜單中可獲得的CVS操作
Team菜單可從任何工作空間資源的快捷菜單中獲
得。有幾個(gè)CVS操作是與Team菜單相關(guān)的。我們將對(duì)使用CVS進(jìn)行工作維護(hù)中最常用的操作進(jìn)行總結(jié)。Team菜單下的具體子菜單隨著所選擇的是否是一
個(gè)項(xiàng)目而發(fā)生變化。只有在項(xiàng)目沒有被CVS或任何其他資源庫(kù)管理時(shí),所選擇的項(xiàng)目才會(huì)有一個(gè)Share
Project…操作。表5-3所提供的是一個(gè)所有CVS小組操作的參考列表。其中有些操作可能是您不熟悉的。我們將在本章后面對(duì)這些操作進(jìn)行討論。通常
情況下,您最常用的操作是Share Project…、Synchronize with
Repository…、Update…以及Commit…。Share
Project操作是一個(gè)允許您將項(xiàng)目加到CVS中的綜合性向?qū)А亩xCVS資源庫(kù)連接到提交項(xiàng)目資源之間的每一個(gè)步驟都包括在該向?qū)е小?/p>
表5-3 Team菜單中的CVS操作
操 作
|
描 述
|
Add to .cvsignore…
|
該
操作會(huì)將所選的項(xiàng)目文件排除在CVS管理之外。這些被排除的文件不會(huì)出現(xiàn)在Synchronize視圖之中,也不會(huì)被提交給CVS資源庫(kù)。CVS在您的項(xiàng)
目中維護(hù)了一個(gè)名為.cvsignore的文件。在該文件中會(huì)標(biāo)識(shí)出那些被排除的文件實(shí)例。一開始,.cvsignore文件是不存在的;在該操作第一次
執(zhí)行時(shí),才會(huì)創(chuàng)建.cvsignore文件。您必須將.cvsignore文件添加到版本控制中,并在CVS中維護(hù)該文件
|
Add to Version Control
|
該操作會(huì)將所選文件置于CVS控制之下。典型情況下,在項(xiàng)目中創(chuàng)建新文件時(shí)會(huì)使用該操作。如果您沒有將資源顯式地添加到版本控制中,那么在執(zhí)行提交操作時(shí),Eclipse會(huì)對(duì)您作出提示
|
Apply Patch…
|
該操作將使用由Create Patch操作所創(chuàng)建的補(bǔ)丁文件來(lái)修補(bǔ)程序
|
Branch…
|
該操作會(huì)創(chuàng)建一個(gè)分支。這樣,項(xiàng)目(或所選資源)可獨(dú)立于其他開發(fā)過程而被修改
|
Change ASCII/Binary
Property…
|
執(zhí)行該操作后會(huì)顯示Set Keyword Substitution向?qū)?。該向?qū)г试S您為所選文件選擇期望的CVS關(guān)鍵字替換模式。它對(duì)CVS如何解釋ASCII或二進(jìn)制文件進(jìn)行了定義
|
Commit…
|
如
果沒有沖突發(fā)生,該操作會(huì)使用您的本地更改來(lái)更新CVS資源庫(kù),并會(huì)提示您給出一個(gè)注釋。如果執(zhí)行該操作時(shí)所選擇的操作對(duì)象是一個(gè)項(xiàng)目或文件夾,那么項(xiàng)目
或文件夾中的所有被修改資源都將提交到CVS中。如果CVS中的相應(yīng)文件取代了所要提交的文件,那么Commit…操作將失敗
|
Create Patch…
|
該操作會(huì)基于本地資源和CVS之間的不同而創(chuàng)建一個(gè)補(bǔ)丁文件。其他人可共享該補(bǔ)丁文件。這就允許在資源庫(kù)之外共享您的工作
|
Disconnect…
|
該操作會(huì)在所選工作空間項(xiàng)目中刪除所有CVS連接信息
|
(續(xù)表)
操 作
|
描 述
|
Edit
|
該
操作只可用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目。該操作會(huì)通知CVS服務(wù)器,讓它知道您
正在更新該文件。如果有其他人(一個(gè)或多個(gè))正在編輯該文件,那么您將被提示,以就是否繼續(xù)該操作作出決定。此時(shí),您可忽略該提示并對(duì)文件進(jìn)行修改。但
是,在您試圖對(duì)修改進(jìn)行提交時(shí)可能會(huì)碰到?jīng)_突。如果您只是想先打開所要編輯的文件,那么該文件會(huì)被打開。但是在試圖對(duì)該文件進(jìn)行修改時(shí),您會(huì)得到相同的提
示。如果要使用外部編輯器,那么您首先必須要做的是取消該文件的只讀狀態(tài),然后再使用外部編輯器打開該文件。在后面,我們會(huì)對(duì)該操作繼續(xù)進(jìn)行討論
|
Merge…
|
該操作會(huì)將某一具體分支中的修改合并回該分支之前的代碼庫(kù)中
|
Restore from
Repository…
|
對(duì)于那些被刪除的項(xiàng)目文件來(lái)說(shuō),如果它們?nèi)源嬖谟陧?xiàng)目中,并允許您將它們恢復(fù)回原工作空間,則執(zhí)行該操作后會(huì)列出這些被刪除的文件。在本章后面,我們將會(huì)對(duì)該操作進(jìn)行詳細(xì)討論
|
Share Project…
|
只有項(xiàng)目才能使用該操作。而且,只有在那些不受資源庫(kù)管理的項(xiàng)目上才可以看到該操作。執(zhí)行該操作后會(huì)顯示向?qū)АT谠撓驅(qū)е校梢酝瓿傻娜蝿?wù)有:將項(xiàng)目與一個(gè)可以使用的資源庫(kù)相關(guān)聯(lián),以及提交項(xiàng)目資源。其他資源庫(kù)提供程序也可能會(huì)使用該操作
|
Show Annotation
|
執(zhí)行該操作后將切換到CVS Repository Exploring透視圖,并會(huì)將焦點(diǎn)集中到CVS Annotate視圖以顯示出所選文件的注釋
|
Show Editors
|
該
操作適用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目中的文件夾和文件。在執(zhí)行該操作后會(huì)打開
CVS編輯器視圖。在該視圖中會(huì)標(biāo)識(shí)出其他正在編輯該文件或該文件夾中內(nèi)容的用戶。只有那些啟用了Watch/Edit的項(xiàng)目才可能顯示在CVS編輯器視
圖中
|
Show in Repository
History
|
該操作為所選資源顯示CVS Repository History視圖
|
Synchronize with
Repository…
|
該
操作會(huì)將所選擇的文件與CVS資源庫(kù)中的對(duì)應(yīng)文件進(jìn)行比較,并切換到Team
Synchronizing透視圖。比較后所發(fā)現(xiàn)的任何差異都會(huì)顯示在Synchronize視圖中。對(duì)于項(xiàng)目或文件夾來(lái)說(shuō),在執(zhí)行該操作時(shí),它們里面所
包含的全部資源都將與CVS中的對(duì)應(yīng)資源進(jìn)行比較。而那些與CVS中對(duì)應(yīng)資源相比發(fā)生了變化的資源會(huì)被顯示在Synchronize視圖中。在您檢查所有
更改、與資源庫(kù)實(shí)例進(jìn)行比較,以及解決沖突時(shí),這是一種最安全的CVS使用方法
|
Tag as Version…
|
該操作會(huì)為所選項(xiàng)目、文件夾(或文件)以及所有的子文件資源的所有CVS實(shí)例添加版本標(biāo)志。您也可以在CVS Repositories視圖中進(jìn)行版本標(biāo)識(shí)
|
(續(xù)表)
操 作
|
描 述
|
Unedit
|
該
操作只可用于那些啟用了Watch/Edit(可在項(xiàng)目的CVS屬性頁(yè)面或CVS首選項(xiàng)設(shè)置中啟用該功能)的項(xiàng)目文件。該操作會(huì)將您從當(dāng)前正在編輯某一文
件的那個(gè)用戶列表中刪除掉。執(zhí)行該操作后,您會(huì)從當(dāng)前活動(dòng)用戶列表中被刪除,并且所做的任何更改都會(huì)被取消,而所編輯的文件會(huì)恢復(fù)到執(zhí)行任何更新之前的內(nèi)
容。在向CVS提交文件時(shí),如果工作空間副本與服務(wù)器副本完全相同,那么Unedit操作會(huì)被隱式調(diào)用。在本章后面部分,我們還將對(duì)該操作進(jìn)行討論
|
Update…
|
該
操作會(huì)使用CVS中所有最新版本來(lái)更新本地資源。CVS中的更新將與本地資源(二進(jìn)制文件除外)進(jìn)行合并。建議您在使用Commit…操作前執(zhí)行
Update…操作。如果其他人在您的最近一次更新后又進(jìn)行了提交操作,那么您的提交操作將會(huì)失敗。建議您用Synchronize with
Repository…操作來(lái)代替Update…操作
|
5.4.8 Team Synchronizing透視圖和Synchronize向?qū)?/h3>
Team
Synchronizing透視圖是您對(duì)工作空間與CVS(其他資源庫(kù)提供程序可被集成到Team
Synchronizing透視圖中)進(jìn)行同步的大本營(yíng)。在選擇了Team | Synchronize with
Repository…操作后,您會(huì)被提示并切換到Team Synchronizing透視圖。在Team
Synchronizing透視圖中含有Synchronize視圖和一個(gè)編輯器區(qū)域。所有被打開的編輯器都會(huì)顯示在該編輯器區(qū)域中。圖5-7所顯示的就
是一個(gè)Team
Synchronizing透視圖的例子。在Synchronize視圖中,您可以對(duì)本地項(xiàng)目和該項(xiàng)目的CVS副本之間的差別進(jìn)行觀察和操作。其他想使用
該透視圖的資源庫(kù)提供程序也可使用該視圖。在打開一個(gè)文件的同時(shí),Eclipse也會(huì)打開一個(gè)適當(dāng)?shù)谋容^編輯器(文本、Java、XML或圖像)。在比較
編輯器中會(huì)顯示出工作空間文件和CVS中該文件的最新版本之間的差別。這樣,您就可以在將文件提交到CVS之前瀏覽和最終確定該文件的內(nèi)容。
在Synchronize視圖的工具欄上有如下一組按鈕:Incoming Mode
(從CVS中更新)、Outgoing Mode
(提交到CVS)、Incoming and Outgoing Mode
以及Conflicts Mode
。
通過使用上述按鈕,您可以對(duì)同步信息進(jìn)行過濾。在使用了Incoming
Mode按鈕后,您會(huì)看到有哪些操作正在進(jìn)行。如果小組中只有您一個(gè)人,那么可能只有Outgoing
Mode按鈕才是您感興趣的。若要接受所有的傳入更改,則使用Synchronize視圖工具欄上的Update All Incoming
Changes…按鈕
。若要提交您的所有更改,則使用Synchronize視圖工具欄上的Commit All Outgoing Changes…按鈕
。工具欄操作Pin Current Synchronization
允
許您對(duì)先前同步中所使用的一組資源進(jìn)行引用。Synchronize視圖的工具欄上的這些按鈕允許您通過工作集來(lái)過濾內(nèi)容。您可對(duì)比較標(biāo)準(zhǔn)進(jìn)行調(diào)整,并可
使用Layout菜單在樹、壓縮文件夾以及提交集(Commit
Set)之間進(jìn)行視圖切換。提交集允許您查看資源庫(kù)更改。這些更改會(huì)按照提交者、注釋和提交日期來(lái)分類顯示。在確定傳入更改集的更詳細(xì)信息時(shí),這種分類非
常有用。Synchronize視圖擁有自己的Preferences對(duì)話框。在Synchronize視圖的菜單中,您可以打開該
Preferences對(duì)話框。在Synchronize視圖的菜單中,您還可以執(zhí)行Schedule…操作。該操作允許您按照所選擇的某一重復(fù)進(jìn)度來(lái)自
動(dòng)執(zhí)行資源庫(kù)的同步操作。
圖5-7 顯示傳入更改和傳出沖突文件三方比較的Team Synchronizing透視圖
1. Synchronize向?qū)?/h4>
從工作臺(tái)工具欄(或Synchronize視圖菜單欄)的下拉菜單中選擇Synchronize…操作
后
會(huì)出現(xiàn)Synchronize向?qū)?。在Synchronize向?qū)е校梢詫?duì)要與CVS(以及其他那些被允許使用Eclipse小組同步支持的資源庫(kù)提
供程序)進(jìn)行同步的項(xiàng)目進(jìn)行選擇。如圖5-8所示,您可對(duì)工作空間、所選資源或者一個(gè)工作集進(jìn)行同步。在Synchronize向?qū)ЫY(jié)束后,您會(huì)返回到
Team Synchronizing透視圖。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:50:00
原文鏈接
//原文地址:http://hi.baidu.com/xublog/blog/item/b66d38afeb3688ca7dd92a2a.html
Eclipse中的CVS用戶界面
現(xiàn)在,您已經(jīng)對(duì)CVS有了一個(gè)基本的理解。接下來(lái),
我們將討論Eclipse是如何為CVS使用者提供幫助的。在對(duì)其進(jìn)行討論之前,先略為詳細(xì)地看一下Eclipse的CVS用戶界面。在開始之
前,Eclipse的CVS用戶界面是毫無(wú)價(jià)值的。這是因?yàn)?,與Eclipse中的很多操作相似,大多數(shù)的CVS資源庫(kù)訪問操作都在后臺(tái)運(yùn)行,這些操作不
會(huì)對(duì)其他操作造成妨礙。諸如檢出、提交、同步等可能需要長(zhǎng)時(shí)間運(yùn)行的操作并不會(huì)對(duì)您所要完成的其他任務(wù)造成妨礙。在下面所給出的這個(gè)簡(jiǎn)短列表中,列出了在
Eclipse用戶界面中使用CVS時(shí)會(huì)碰到的最常見任務(wù)。在練習(xí)5中,您會(huì)實(shí)踐所有這些任務(wù)。
● 定義到CVS資源庫(kù)的連接。
● 瀏覽CVS資源庫(kù)。
● 將新的工作空間項(xiàng)目定義到CVS中。
● 從CVS中檢出已有項(xiàng)目。
● 將工作空間中的更改提交給CVS。
● 使用CVS中的最新版本來(lái)更新自己的工作空間項(xiàng)目。
● 在合適的里程碑處進(jìn)行版本設(shè)置。
● 用資源庫(kù)中的資源來(lái)比較或替換工作空間中的資源。
5.4.1 CVS Repository Exploring透視圖:資源庫(kù)主頁(yè)
如圖5-1所示的CVS Repository
Exploring透視圖是在Eclipse中使用CVS的大本營(yíng)。在該透視圖中含有CVS Repositories視圖、CVS Resource
History視圖以及編輯器區(qū)域。在CVS Repositories視圖中會(huì)顯示出您的工作空間所知道的CVS資源庫(kù)。而在CVS
Resource History視圖中所顯示的則是受CVS控制的任何已知文件的修改歷史記錄。在CVS Repository
Exploring透視圖中,您可以建立與CVS服務(wù)器的連接。
5.4.2 CVS Repositories視圖
CVS
Repositories視圖扮演著資源庫(kù)瀏覽器的角色。在CVS
Repositories視圖中,您可以對(duì)資源庫(kù)中存在的項(xiàng)目進(jìn)行選擇,并可將這些項(xiàng)目檢出到工作空間中。如圖5-1所示,CVS
Repositories視圖位于CVS Repository Exploring透視圖的左邊窗格中。通過使用快捷菜單New |
Repository Location...或選擇Add CVS Repository
命
令,您可以在自己的工作空間中定義CVS資源庫(kù)的位置。Eclipse支持各種類型的CVS連接(見圖5-2)。在CVS
Repositories視圖中,您可以定義多個(gè)CVS資源庫(kù)。在瀏覽資源庫(kù)時(shí),您可以看到資源庫(kù)中的內(nèi)容。如圖5-1所示,這些內(nèi)容包括HEAD、
Branches、versions目錄中的項(xiàng)目以及Dates條目。您可展開目錄樹或使用工具欄中的Go Into
和Back
操作來(lái)往下一直看到具體文件。在工具欄上有一個(gè)Refresh View
操作,由于CVS Repositories視圖不會(huì)與資源庫(kù)中的內(nèi)容更改自動(dòng)保持一致,所以在做任何重要操作之前,您可能要使用Refresh View
按鈕來(lái)刷新CVS Repositories視圖。
出于方便的考慮,如果您從Resource透視圖中打開了CVS Repositories視圖,那么該視圖將作為一個(gè)選項(xiàng)卡式視圖顯示在Navigator透視圖的旁邊。
在CVS Repositories視圖中,一個(gè)最常見的任務(wù)是從資源庫(kù)中將項(xiàng)目檢出到您的工作空間中。要完成上述任務(wù),請(qǐng)先在Branches、HEAD或Versions下選擇一個(gè)項(xiàng)目,然后再在單擊鼠標(biāo)右鍵后所出現(xiàn)的快捷菜單中選擇Check Out命令。
圖5-1 CVS Repository Exploring透視圖
圖5-2 在工作空間中定義新的CVS資源庫(kù)位置
在第一次展開CVS
Repositories視圖中的Branches目錄時(shí),您會(huì)看到該目錄中沒有任何內(nèi)容。在使用了快捷菜單操作Refresh
Branches…后會(huì)出現(xiàn)Refresh Branches對(duì)話框(見圖5-3)。在Refresh
Branches對(duì)話框中,您可以為一個(gè)或多個(gè)資源庫(kù)項(xiàng)目執(zhí)行CVS中的分支標(biāo)記檢索請(qǐng)求。CVS資源庫(kù)中可以包含大量分支。而您可能僅對(duì)其中的部分分支
感興趣。在Refresh Branches對(duì)話框中,您可以對(duì)要進(jìn)行分支標(biāo)記信息檢索的項(xiàng)目進(jìn)行選擇。在表5-1所示的參考列表中,列出了CVS
Repositories視圖中的所有可用的快捷菜單操作。其中有些操作依賴于您在圖5-3的第3個(gè)欄目中的選擇。一開始,您可能需要使用以下這些操
作:New | Repository Location…、Check Out…、Compare with…以及Show in Resource
History?,F(xiàn)在,您不必理解這些操作,它們僅為您提供一個(gè)參考。
圖5-3 Refresh Branches對(duì)話框
表5-1 在CVS Repositories視圖中可使用的上下文操作
操 作
|
描 述
|
從快捷菜單中可獲得該命令
|
Add to Branch
List…
|
將一個(gè)項(xiàng)目(但不包括該項(xiàng)目的內(nèi)容)添加至一個(gè)新的或已經(jīng)存在的分支上。該操作可代替Team | Branch操作。對(duì)于那些將在一個(gè)分支中單獨(dú)開發(fā)的新項(xiàng)目來(lái)說(shuō),該操作是比較有用的
|
被選擇的項(xiàng)目
|
Check Out
|
把從資源庫(kù)中所選擇的內(nèi)容復(fù)制到自己的工作空間中。而且文件夾可被檢出,同時(shí)該文件夾與項(xiàng)目的一致性會(huì)得到維護(hù)。對(duì)于含有獨(dú)立部分的大型項(xiàng)目來(lái)說(shuō),該操作非常有用
|
被選擇的項(xiàng)目,以及在Branches、HEAD或Versions下所選擇的項(xiàng)目文件夾
|
Check Out As…
|
把從資源庫(kù)中所選擇的內(nèi)容復(fù)制到自己的工作空間中,并以另外一個(gè)名稱來(lái)命名。在對(duì)所做的更改進(jìn)行提交時(shí),該項(xiàng)目保持它在CVS中的初始一致性。當(dāng)需要在工作空間中同時(shí)擁有某一項(xiàng)目的多個(gè)實(shí)例時(shí),該操作非常有用
|
被選擇的項(xiàng)目,以及在Branches、HEAD或Versions下所選擇的項(xiàng)目文件夾
|
(續(xù)表)
操 作
|
描 述
|
從快捷菜單中可獲得該命令
|
Compare
|
在選擇了兩個(gè)資源庫(kù)文件后,執(zhí)行該操作會(huì)顯示出Compare視圖
|
兩個(gè)被選擇的資源庫(kù)
|
Compare With…
|
該操作會(huì)打開Compare with Branch or Verson對(duì)話框,并允許您將所選資源與Branches、HEAD或Versions中的資源進(jìn)行比較
|
被選擇的資源
|
Configure Branches and
Versions…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框。在所顯示的對(duì)話框中會(huì)顯示出資源中的分支或版本標(biāo)記。而對(duì)話框中所顯示的那些標(biāo)記會(huì)顯示在CVS Repositories視圖中
|
各種對(duì)象
|
Copy to Clipboard
|
將連接字符串復(fù)制到寫字板上。例如:pserver: anonymous@dev.eclipse.org:/home/eclipse
|
被選擇的資源庫(kù)
|
Discard location
|
從CVS Repositories視圖中刪除所選資源庫(kù)的位置定義
|
被選擇的資源庫(kù)
|
New | Date Tag…
|
執(zhí)行該操作后會(huì)顯示出一個(gè)對(duì)話框以創(chuàng)建新的日期標(biāo)記
|
被選擇的資源庫(kù),在CVS Repositories視圖中所選擇的Dates條目
|
New | Repository Location…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框以定義新的CVS資源庫(kù)位置。另外還可獲得一個(gè)工具欄圖標(biāo)
|
任何對(duì)象
|
Open
|
執(zhí)行該操作后會(huì)在編輯器中打開所選文件的最新版本
|
被選擇的文件
|
Properties
|
顯示所選資源庫(kù)的屬性及其連接信息
|
被選擇的資源庫(kù)
|
Refresh Branches…
|
執(zhí)行該操作后將顯示出一個(gè)對(duì)話框以允許您發(fā)現(xiàn)一個(gè)或多個(gè)項(xiàng)目的分支
|
在CVS Repositories視圖中所選擇的Branches條目,被選擇(或沒有被選擇)的資源庫(kù)位置
|
Refresh View
|
使用資源庫(kù)的當(dāng)前信息來(lái)刷新CVS Repositories視圖
|
各種對(duì)象
|
Remove
|
將所選的日期標(biāo)記從CVS Repositories視圖刪除掉
|
被選擇的日期標(biāo)記
|
Show Annotation
|
該操作會(huì)為所選文件顯示CVS Annotate視圖
|
被選擇的文件
|
Show In Resource History
|
該操作會(huì)在CVS Resource History視圖中顯示所選文件的版本歷史信息
|
被選擇的文件
|
Tag As Version…
|
將一個(gè)版本標(biāo)記應(yīng)用到所選的資源及其子資源上
|
被選擇的資源
|
Tag With
Existing…
|
該操作會(huì)將一已有的資源庫(kù)版本或分支標(biāo)記應(yīng)用到所選的資源上。這是一個(gè)比較特殊的操作。有關(guān)何時(shí)使用該操作的更多信息請(qǐng)參見聯(lián)機(jī)幫助中的Moving Version Tags專題
|
被選擇的資源
|
作者:caoyinghui1986 發(fā)表于2009-8-28 21:47:00
原文鏈接
原文地址:http://hi.baidu.com/xublog/blog/item/6579e60e8364fdcc7bcbe19e.html
版本控制在團(tuán)隊(duì)開發(fā)中是必不可少的。CVS是優(yōu)秀的開源版本控制軟件,Eclipse本身就內(nèi)置了對(duì)CVS的支持,只需簡(jiǎn)單配置,即可使用CVS。
首先我們要正確安裝并配置好CVS服務(wù)器,通常Linux Server都自帶CVS服務(wù),不過命令行操作比較繁瑣。Windows下也有簡(jiǎn)單易用的CVS服務(wù)器,這里我們推薦CVSNT,可以下載CVSNT 2.0.51a,安裝并啟動(dòng)CVSNT:
然后切換到Repositories面板,添加一個(gè)Repository,命名為/cvs-java,CVSNT會(huì)提示是否初始化這個(gè)Repository,選擇是:
然后在Advanced面板上選中“Pretend to be a Unix CVS version”:
然后,在Windows賬戶中為每一個(gè)開發(fā)人員添加用戶名和口令。
現(xiàn)在,CVSNT的安裝配置已經(jīng)完成,下一步,啟動(dòng)Eclipse,我們可以使用原有的Hello工程,或者新建一個(gè)Project,然后選擇菜單
Window->Show View->Other,打開CVS->CVS Repositories:
然后點(diǎn)擊按鈕
,添加一個(gè)Repository:
注意用戶名和口令直接填Windows的用戶名和口令,然后選中“Validate Connection on Finish”,點(diǎn)擊Finish完成:
首先,我們要將一個(gè)現(xiàn)有的工程放到CVS服務(wù)器中,切換到Package Explorer,選中Hello工程,右鍵點(diǎn)擊,選擇Team->Share Project…:
使用剛才我們添加的Repository,繼續(xù),并將所有文件都添加到CVS中,最后Eclipse提示Commit:
填入一個(gè)簡(jiǎn)單的注釋,確定,然后Eclipse會(huì)把整個(gè)工程提交到CVS服務(wù)器,可以在Package
Explorer中看到圖標(biāo)發(fā)生了變化,Hello.java文件后面會(huì)有版本號(hào)1.1。在CVS
Repositories面板中刷新,可以看到剛添加進(jìn)來(lái)的工程:
在團(tuán)隊(duì)開發(fā)中,當(dāng)創(chuàng)建了一個(gè)基本的工程并提交到CVS后,別的開發(fā)人員首先要Check
Out這個(gè)工程到各自的本地計(jì)算機(jī)上,這里為了演示,首先我們?cè)赑ackage Explorer中刪除Hello工程,然后打開CVS
Repositories(如果沒有看到Repository就按照上面的方法添加Repository),選擇Hello工程,右鍵點(diǎn)擊,選擇
Check Out As…:
作為一個(gè)Project簽出,就可以在Package Explorer中看到簽出的工程。
當(dāng)對(duì)某些源文件作了修改后,需要提交更改到CVS服務(wù)器。選中更改的文件或工程,右鍵點(diǎn)擊,選擇Team->Commit…:
然后填入簡(jiǎn)單的注釋,就可以提交到CVS服務(wù)器上了,可以看到源文件的版本號(hào)變成了1.2。
以上簡(jiǎn)單介紹了如何搭建CVS服務(wù)器以及在Eclipse中如何使用CVS,可以參考CVS手冊(cè)以便了解Branch、Merge等更多功能的使用。
作者:caoyinghui1986 發(fā)表于2009-8-28 21:40:00
原文鏈接
曾因項(xiàng)目的迫切需要計(jì)劃開發(fā)一打包軟件,最終卻夭折。現(xiàn)在回想多有遺撼。不得不令我反思當(dāng)中的教訓(xùn)。
我認(rèn)為要想開發(fā)一個(gè)成功的軟件兩個(gè)大的環(huán)境是必不可少的,一個(gè)是外部環(huán)境,包括公司的支持,領(lǐng)導(dǎo)的鼓勵(lì)和擁有一個(gè)穩(wěn)定的,成熟的項(xiàng)目團(tuán)隊(duì),相對(duì)穩(wěn)定的用戶群體。還有一個(gè)是對(duì)軟件本身的規(guī)劃,包括對(duì)需求的明確,系統(tǒng)的架構(gòu),工作量的評(píng)估,明確的項(xiàng)目計(jì)劃和有序的計(jì)劃執(zhí)行。
打包工具的失敗就是一個(gè)印證。
打包工具的構(gòu)想是源于項(xiàng)目中,繁鎖的,重復(fù)的人工打包操作,包括從配置庫(kù)一下代碼,編譯,打包,上傳FTP等操作,由于打包后進(jìn)行問題驗(yàn)證時(shí)又時(shí)常出問題,所以該過程不得反復(fù)多次執(zhí)行。執(zhí)行過程中又難免出現(xiàn)放錯(cuò)文件,漏打文件等不必要的錯(cuò)誤從而嚴(yán)重影響項(xiàng)目進(jìn)度。
打包工具就是為解決打包過程中的繁鎖操作,提供可視化界面,為打包提供一鍵式操作。一開始構(gòu)想時(shí)好的。但是一開始也是錯(cuò)的,因?yàn)榇虬ぞ咭婚_始就缺乏一個(gè)可供運(yùn)作的外部環(huán)境。公司不知道有這個(gè)項(xiàng)目的存在,或許還稱不上是一個(gè)項(xiàng)目,因?yàn)樗皇俏覀€(gè)人提出的一個(gè)優(yōu)化項(xiàng)目流程的簡(jiǎn)單方案。但是也由于這個(gè)問題,為項(xiàng)目的失敗埋下了一個(gè)定時(shí)炸彈。
開始對(duì)項(xiàng)目進(jìn)行簡(jiǎn)單的規(guī)劃后,包括簡(jiǎn)單的需求分析,系統(tǒng)的架構(gòu)。沒有正式的文檔,也沒有對(duì)文檔進(jìn)行評(píng)審和風(fēng)險(xiǎn)評(píng)估。就開始著手開發(fā)了。開發(fā)過程中不斷的變更架構(gòu)(因?yàn)橐婚_始就沒有一個(gè)好的架構(gòu)),不斷的變更需求(雖然需求是自己做的),沒改一個(gè)地方,對(duì)代碼都是翻天覆地的變化,當(dāng)中的辛酸或許只有我自己才能體會(huì)。先拋開架構(gòu)不說(shuō),為什么自己做的需求,自己開發(fā),需求都還會(huì)變呢?那是因?yàn)樵陂_發(fā)過程中,你站在用戶的角度一想,發(fā)現(xiàn)那樣做確實(shí)不當(dāng),得改。這就告訴我們問題越早發(fā)現(xiàn),就越容易被解決。想想如果該需求是在需求文檔中詳細(xì)體現(xiàn)出來(lái),在需求評(píng)審的時(shí)候被發(fā)現(xiàn),那改改文檔也就了事了,等到了開發(fā)時(shí)才發(fā)現(xiàn)這個(gè)問題,想想那個(gè)時(shí)候去改那又會(huì)有多大的改動(dòng)。這也告訴我們好的文檔不僅能有效的指導(dǎo)開發(fā),提高質(zhì)量。也能更及時(shí)的發(fā)現(xiàn)問題,避免不必要的改動(dòng)。更是后期維護(hù)升級(jí)的一個(gè)依據(jù)。
當(dāng)然這些變化還不足以讓一個(gè)項(xiàng)目夭折。打包工具一開始規(guī)劃其中一部份包含了對(duì)開發(fā)人員的代碼進(jìn)行檢視等功能,但由于公司推出了一個(gè)工具已經(jīng)具備這一功能,使得打包工具的這一需求已不在具備這一用戶群體。所以穩(wěn)定的用戶群體在一個(gè)軟件開發(fā)過程中也是一個(gè)不可忽視的環(huán)節(jié)。
在項(xiàng)目開發(fā)到中期,我被分配到一個(gè)實(shí)際項(xiàng)目中,由于沒有多余的時(shí)間來(lái)做這個(gè)不被重視的工具,打包工具開始慢慢夭折。從這個(gè)事分析,我個(gè)人其實(shí)也算是這個(gè)項(xiàng)目的一個(gè)穩(wěn)定項(xiàng)目團(tuán)隊(duì)。我被分配到其它項(xiàng)目中就算是為這個(gè)穩(wěn)定的團(tuán)隊(duì)帶來(lái)了不穩(wěn)定因素。結(jié)果導(dǎo)致項(xiàng)目夭折??梢娨粋€(gè)穩(wěn)定的,成熟的項(xiàng)目團(tuán)隊(duì)在項(xiàng)目中的重要性。
這個(gè)項(xiàng)目雖然失敗了,但我從中吸取了很多教訓(xùn)。如果再給我一次機(jī)會(huì)來(lái)做這個(gè)項(xiàng)目,有幾個(gè)事情我必須得做。
1,向公司審請(qǐng),將該項(xiàng)目作為公司內(nèi)部項(xiàng)目正式立項(xiàng)。確保有一個(gè)穩(wěn)定的外部環(huán)境。
2,向廣大用戶(開發(fā)人員)收集需求,整理形成軟件的基本規(guī)格。
3,明確制定項(xiàng)目計(jì)劃,有組織,有目地的進(jìn)行研發(fā)。
4,根據(jù)基本規(guī)格編寫需求文檔,明確功能點(diǎn),進(jìn)行大眾評(píng)審,及時(shí)發(fā)現(xiàn)問題。
5,制定詳細(xì)的架構(gòu)規(guī)劃。進(jìn)行評(píng)審。
6,協(xié)調(diào)有扎實(shí)功底的開發(fā)人員,確保技術(shù)難題被攻破
7,協(xié)調(diào)有豐富經(jīng)驗(yàn)的測(cè)試人沒,保證版本質(zhì)量
作者:caoyinghui1986 發(fā)表于2009-8-28 21:27:00
原文鏈接
Create DataBase SHOPPING;
go
use SHOPPING;
go
/*==============================================================*/
/* Table: CATEGORIES */
/*==============================================================*/
create table CATEGORIES (
CATEGORY_ID bigint identity,
CATEGORY_NAME varchar(100) not null,
CATEGORY_DESCN varchar(500) null,
constraint PK_CATEGORIES primary key (CATEGORY_ID)
)
go
/*==============================================================*/
/* Table: PRODUCTS */
/*==============================================================*/
create table PRODUCTS (
PRODUCT_NO varchar(10) not null,
CATEGORY_ID bigint not null,
PRODUCT_NAME varchar(300) not null,
PRODUCT_PRICE float not null,
PHOTO_PATH varchar(100) null,
PRODUCT_DESCN varchar(2000) null,
constraint PK_PRODUCTS primary key (PRODUCT_NO)
)
go
/*==============================================================*/
/* Table: PRODUCT_SUPPLY */
/*==============================================================*/
create table PRODUCT_SUPPLY (
SUPPLY_NO varchar(10) null,
PRODUCT_NO varchar(10) null
)
go
/*==============================================================*/
/* Table: SUPPLIERS */
/*==============================================================*/
create table SUPPLIERS (
SUPPLY_NO varchar(10) not null,
SUPPLY_NAME varchar(200) not null,
SUPPLY_DESCN varchar(400) null,
constraint PK_SUPPLIERS primary key (SUPPLY_NO)
)
go
/*==============================================================*/
/* Create Relation */
/*==============================================================*/
alter table PRODUCTS
add constraint FK_PRODUCTS_REFERENCE_CATEGORI foreign key (CATEGORY_ID)
references CATEGORIES (CATEGORY_ID)
go
alter table PRODUCT_SUPPLY
add constraint FK_PRODUCT__REFERENCE_PRODUCTS foreign key (PRODUCT_NO)
references PRODUCTS (PRODUCT_NO)
go
alter table PRODUCT_SUPPLY
add constraint FK_PRODUCT__REFERENCE_SUPPLIER foreign key (SUPPLY_NO)
references SUPPLIERS (SUPPLY_NO)
go
創(chuàng)建數(shù)據(jù)庫(kù)腳本的
PRODUCTS(產(chǎn)品表) 和 CATEGORIES(類別表)一對(duì)多 PRODUCT_SUPPLY 為中間表 SUPPLIERS(供貨商表) 和 PRODUCTS 為多對(duì)多的關(guān)系。
products 表 hbm.xml
<many-to-one name="category" class="Category" cascade="save-update">
<column name="CATEGORY_ID" />
</many-to-one>
<!--多對(duì)多的關(guān)系中table指向的是中間表-->
<set name="supplys" table="PRODUCT_SUPPLY" cascade="save-update">
<!--key指向的是外鍵-->
<key column="PRODUCT_NO"></key>
<!--column對(duì)應(yīng)中間表中的外鍵-->
<many-to-many class="Supply" column="SUPPLY_NO"></many-to-many>
</set>
category 表 hbm.xml
<set name="productes" table="productes" cascade="save-update" inverse="true">
<!--key指向的是外鍵-->
<key column="CATEGORY_ID"></key>
<one-to-many class="Product"/>
</set>
supply 表 hbm.xml
<set name="products" table="PRODUCT_SUPPLY" inverse="true" cascade="save-update">
<key column="SUPPLY_NO"></key>
<many-to-many class="Product" column="PRODUCT_NO"></many-to-many>
</set>
1, 添加一個(gè)的新商品名稱為”Compaq 2620” 該商品屬于“筆記本”類別 由當(dāng)前所有的提供商提供貨源
List list = session.createQuery("from Supply").list(); Category c = (Category) session.get(Category.class, new Long(1)); product.setCategory(c); product.setSupplys(new HashSet(list)); session.save(product);
2, 查詢編號(hào)為” S0001”的提供商提供的所有商品 //通過隱式內(nèi)連接導(dǎo)航 List list = session.createQuery("from Product p where p.supplys.supply_no='S0001'").list(); 隱式內(nèi)連接導(dǎo)航 要注意的一個(gè)問題是 從many端到 one 端 可以無(wú)限導(dǎo)航 但從one到many端只能導(dǎo)航一級(jí)
3,查詢編號(hào)為”S0002”的提供商提供的所有商品所涉及的類別 session.createQuery("from Category c where c.productes.product_no in (select p.product_no from Product p where p.supplys.supply_no='S0002' ) ").list(); 用到子查詢
4,查詢名稱為”TCL SHE8533”的商品的每個(gè)提供商的編號(hào)、名稱(部分屬性查詢) session.createQuery("select s.supply_no,s.supply_name from Supply s where s.products.product_name='TCL SHE8533'").list(); //投影查詢。如果想將查詢出來(lái)的 結(jié)果封裝成對(duì)象 用 select new package.Temp(s.a,s.b...) from .... Temp提供相應(yīng)的構(gòu)造方法包含可選的字段注意帶包名。
5, 查詢多于3種商品的類別信息(使用size函數(shù)處理) session.createQuery("from Category s where s.productes.size>3").list(); 注意其中的 size 表示的是 商品類別中產(chǎn)品數(shù)量多于3的類別。size用來(lái)處理集合中的大小
6,查詢至少有一個(gè)商品的類別信息(使用exists處理) session.createQuery("from Category c where exists( from c.productes) ").list();
7,查詢可以提供某種商品的供應(yīng)商信息(使用elements處理) session.createQuery("from Supply s where :product in elements(s.products) ")..setParameter("product", product).list(); product為 一個(gè) 對(duì)象 。 product in elements(s.products) 表示這個(gè)對(duì)象是否在這個(gè)集合中
8,使用本地SQL,顯示所有商品的商品名、價(jià)格以及類別信息,并降序排列。 session.createSQLQuery("select p.PRODUCT_NAME,p.PRODUCT_PRICE ,c.* from PRODUCTS p ,CATEGORIES c where p.CATEGORY_ID = c.CATEGORY_ID order by p.PRODUCT_PRICE desc") 的到的 集合中是個(gè) Object[]; 如果想返回對(duì)象 可以用 命名sql并在配置文件中指定返回的對(duì)象類型。
9 分頁(yè)查詢 :將商品按價(jià)格升序排列后,取第三頁(yè)的記錄,(每頁(yè)顯示2條記錄) Query query = session.createQuery("from Product p order by p.product_price ") .setFirstResult(2*(3-1)) .setMaxResults(2);
10,查詢所有類別的名字,及該類別包含的商品數(shù)量 (使用group by ,count函數(shù)) session.createQuery("select max(c.category_name), count(p) from Category c inner join c.productes p group by c.category_id ") 還有一種簡(jiǎn)單的方式就是 "select c.category_name, c.products.size from Category c "
11,批處理: 將某個(gè)類別下的商品修改為現(xiàn)有的另一個(gè)類別。 int count = session.createQuery("update Product p set p.category=:category where p.category.category_id='1'") .setParameter("category",c ).executeUpdate(); c為加載的一個(gè)新的類別
12,往數(shù)據(jù)庫(kù)中初始化3個(gè)名稱相同的商品(其他字段自行設(shè)置)。 要求:查詢所有商品,如果多個(gè)商品的名稱相同,則取其中任意一個(gè)完整的商品信息
hql = "from Prodcut pp where pp.product_no in (select max(p.category_id) from Product p group by p.product_name") ; 注意后面的一個(gè) 小技巧。 由于group by 后只能包含 group by字段和聚合函數(shù) 所以如果我想?yún)^(qū)別的字段似乎不可能 。但我們不妨將你要取的那個(gè)字段也加個(gè)聚合函數(shù)min 或 max 這樣就可以取出你要的 任意字段了。適應(yīng)sql sql2000中不妨 在pubs 下運(yùn)行 select max(title_id) as 編號(hào) ,count(type) as 數(shù)量, type from titles group by type 看看結(jié)果就知道了 雖然只 group by 了 type但 還是可以得到title_id
作者:caoyinghui1986 發(fā)表于2008-6-15 12:39:00
原文鏈接
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script> //供DEMO02_01頁(yè)面的關(guān)閉按鈕調(diào)用 function myFunction(v){ //alert("這里是父窗口中的函數(shù)"+v); document.getElementById("parentText").value=v; }
//打開新窗口 function openNewWindow(){ window.open("DEMO02_01.html","","height=300;width=300;location=0;status =0;toolbar=0");
}
</script> </head>
<body>
<button onclick="openNewWindow();">打開新窗口</button> <hr> 此文本框的值要從子窗口中取得 <input type="text" id="parentText"> </body> </html>
DEMO02_01.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <script> function funClose(){ //:調(diào)用父窗體(DEMO02.html)中的myFunction 函數(shù) //window.opener獲得父窗口的window對(duì)象的引用 并調(diào)用 myFunction () 函數(shù)在js中作為window的屬性 window.opener.myFunction(document.getElementById("childText").value);
window.close(); } </script>
</head>
<body> <button onclick="funClose();">關(guān)閉本窗口</button> <hr> 此文本框的值將要傳遞到父窗口 <input type="text" id="childText" value="子窗口的值:1"> </body> </html>
作者:caoyinghui1986 發(fā)表于2008-6-15 12:31:00
原文鏈接