2008-12-31 67 views
22

我使用SVN作爲源代碼控制系統,我想知道如何比較目錄,同時忽略任何元數據差異。有沒有辦法告訴svn diff只比較實際內容並忽略任何元數據?SVN DIFF命令是否有元數據排除過濾器?

我的意思是元數據像SVN屬性等不影響文件內容。假設文件X在分支B中與trunk T相比具有附加屬性。不幸的是,即使文件X的實際內容相同,它也會顯示在'svn diff T B'中。

我期待這樣的事情:

svn diff https://example.org/tags/v1 https://example.org/tags/v2 -x -ignore-metadata --summarize 

更新:我部分地通過直接在文件系統diff'ing而不是使用SVN工具解決了這個。看到我自己的回答如下...

+0

你是什麼意思的元數據? – codelogic 2008-12-31 08:32:44

+0

「SVN屬性」是一個更好的詞來描述它。我修復了我的帖子,以澄清這一點.. – driAn 2008-12-31 10:39:31

+0

如果你找到一個解決方案,請發佈它,我很好奇這將如何完成。也許GIT有這個功能...... – 2009-01-03 06:30:53

回答

3

似乎沒有辦法使用svn內置工具來完成此操作。我如何解決它: 導出兩個樹並使用您最喜愛的diff工具直接在文件系統上進行區分。這是完成此操作的唯一方法:/

0

我不確定,但一個簡單的'svn diff | grep -iv「要忽略的東西」將是一種解決方法。

+1

整個差異只是作爲一個大量的文本,我不得不手動解析它來過濾掉所有'svn屬性added'-like變化。不幸的是,我不能使用grep完成任何簡單的任務。 – driAn 2009-01-02 17:06:06

-6

你可以設置svn:ignore屬性的文件和目錄你想svn diff忽略。

+1

我不想忽略特定的目錄或文件,它是關於忽略相同文件的不同屬性(又稱元數據)。假設文件X在分支B中與trunk T相比具有附加屬性,即使實際內容相同,它也會顯示在svn diff中。 – driAn 2008-12-31 09:56:55

10

如果您使用--summarize選項,則屬性更改將在第二列而非第一列中指示。

即,

M URL -- indicates content change 
M URL -- property change 
MM URL -- content and property change 

這是一個有點容易的grep。我想如果你想要一個完整的比較,你可以有一個兩階段的過程 - 首先使用總結來找到內容改變的文件,然後區分它們。

5

從JosephWatkins的尼斯提示。

下面是grep的-初級用戶的命令:

svn diff A B --summarize | grep '^. ' 

grep的查找就行第二個字符的空間。

1

我寫了一個腳本來做到這一點,我找不到一個在線。

該腳本根據在腳本頂部輸入的正則表達式數組刪除數據。目前,它設置爲過濾掉屬性更改,但可以刪除與一系列正則表達式匹配的所有更改。

在設置腳本之後,只需將svn diff的輸出傳送給腳本。我將過濾器放在腳本中而不是參數中,因爲我總是運行相同的過濾器。

我將它作爲GPLv2發佈。

clean_svn_diff.bash

21

可以通過「filterdiff --clean」傳遞的svn diff的輸出,以除去任何多餘的線,包括屬性更改。

2

這是一個單一的命令,可以做到這一切。假設你要查找所有(非財產)的修訂54833和57215.之間在當前目錄下的所有文件的比較這個命令應該這樣做:

svn diff -r 54833:57215 --summarize | egrep -v '^ |^D|^A' | awk '{ print $2 }' | xargs svn diff -r 54833:57215 

注:只的diff修改的文件 - 不添加或刪除文件。

1

發現這個同時通過SVN幫助文檔

svn diff --patch-compatible 

這是相同的搜索爲運行

svn diff --show-copies-as-adds --ignore-properties