2009-09-23 48 views
4

我們的團隊使用svn來管理我們的來源。在C文件上執行重新計算時,我偶爾會更改函數並在文件中移動它們。通常我會盡量避免移動函數,因爲它會使默認的svn diff對於正在發生的事情稍微有些誤解,並且它通常會提供一個比它所需要的更加混亂的diff。如何獲得基於c函數的差異?

無論如何,我偶爾會進行功能文件位置更改和功能內部代碼更改。另一個出現的地方是分支合併,當文件發生衝突時,其中一個或兩個分支都有移動以及功能內變化。

所以,我在尋找的是一個語義意識的差異工具,可以告訴我差異在兩個層次 - 函數排列和細節(函數內)。我嘗試使用「-p」選項來區分(-x -p到svn diff),但這不是它的目的,它確實沒有做我想要的。

我剛纔想到的另一個選擇是使用diff程序來捕捉代碼複製,比如大學可能會用來檢查分配,但沒有什麼明顯的出現在快速搜索中。

+0

我不知道一個diff工具可以做你想做的。我似乎記得CodeWarrior內置的一個捕捉移動代碼。 (我認爲它抓住了多行被移動,而不是功能,但這幾乎一樣好)。但是CW已經死了。無論如何,如果沒有人提出解決方案(並且「使用git代替」本來就是我的神經),如果你自己找到了一些東西,我會非常感興趣。 – sbi 2009-09-23 08:22:21

回答

1

使用您所擁有的工具來做到這一點的一種方法是首先移動功能,檢查它們,然後改變它們。或者有兩個徵募,當你看到這種情況發生時,將他們移到另一箇中,解決合併問題。它將工作轉移給你,但使代碼評論更容易。

+0

它使它更容易,因爲它避免了我試圖解決的問題。我已經知道如何做到這一點。 我在問題中增加了另一個示例情況(合併),以澄清這個問題是針對將兩個操作分開的情況是嚴重的問題。 – Peter 2009-09-23 05:44:40

+0

噢,那很糟糕。正是出於這個原因,我們離開了SVN。和別的。 – 2009-09-23 06:38:06

+1

有更好的差異工具,奇怪的是一個很不錯(但不是免費的)。但是,我不記得使用任何明確做你想要的。非常不幸。如果可能的話,這將是一個很棒的功能。 – 2009-09-23 16:56:59

-2

你可以嘗試這樣做,重構與git

而且使用Git時,整個「保持代碼運動的變化分離」有一個更根本的原因:混帳可以再次跟蹤代碼運動(,無論是移動一個完整的文件還是僅僅是一個文件之間的函數),並且執行'git blame -C'實際上會跟隨文件之間的代碼移動。它是通過相似性分析來實現的,但這確實意味着如果你同時移動代碼來改變它,git不能看到'哦,該函數最初來自其他文件',現在你變得更糟了有關代碼實際來源的註釋。

所以,這個想法是初始化一個git倉庫,並重播所有相關的svn-commits到該倉庫。之後,使用git來找出哪些內容移到了哪裏。

+0

什麼是downvote? – akira 2009-09-23 06:01:56

+2

這不是我,但我懷疑這可能是因爲這個問題是關於如何在svn中完成基於函數的差異的具體問題。 – Martin 2009-09-23 07:02:32

0

,因爲你增加的問題有點與上次編輯的難度級別:

有什麼SVN可以做限制,這就是爲什麼混帳寫的原因。回答你的問題基本上是「沒有,沒有工具,可以在語義水平SVN跟蹤代碼」

(實際上有可供混帳也沒有任何語義的追蹤工具,它跟蹤的內容)

+0

stackoverflow不是一個論壇,請將意見發送到下面的原始問題或答案。 – Justicle 2009-09-23 06:07:13

+1

AFAIK你可以使用你喜歡的任何diff工具與SVN。如果你碰巧有一個功能級比較,那麼SVN也是如此。所以這不是git與SVN的問題。 -1 – sbi 2009-09-23 08:17:30

0

我在不同的提交中做了外觀變化(移動功能)和功能變化,並在提交信息中添加「化妝品」。這樣一來,化妝品工作中的巨大而無趣的差異就被忽略了,並且你對功能變化有一個簡潔的差異。