2011-03-21 66 views
6

我想在我的git存儲庫中應用此過濾器,以便在結帳時從解決方案文件中刪除一部分,並在提交期間添加此部分。這個git smudge/clean過濾器有什麼問題?

這是我想刪除或添加的部分:

GlobalSection(SubversionScc) = preSolution 
    Svn-Managed = True 
    Manager = AnkhSVN - Subversion Support for Visual Studio 
EndGlobalSection 

我已經安裝該過濾器在我的.git /信息/屬性

*的.sln過濾= SourceControlProvider

我已將這些命令添加到我的配置中

$ git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d' %" 
$ git config filter.SourceControlProvider.clean "sed -n -e '/^Global$/ r ankhsvnsection ' < %" 

嗯,它不工作。我做錯了什麼?

ankhsvnsection是在於相同的目錄* .sln文件

+0

你檢查,如果一個簡單的sed的是工作?還是在執行時沒有發現sed問題? – VonC 2011-03-21 18:26:14

回答

13

我在這裏看到的幾個問題的文本文件:

  1. 您在兩個過濾器到底有%
    這沒有什麼特別的含義,將作爲額外的參數傳遞給sed,這可能會產生一個錯誤(除非你有一個名爲%的文件)。
    過濾器應該是「流式傳輸」(從標準輸入讀取並寫入標準輸出)。他們的定義可以包括%f,但它不應該被視爲一個文件來讀取或寫入; Git做這個部分,過濾器應該從標準輸入讀取並寫入標準輸出。

  2. 您的乾淨的過濾器試圖從%f重定向stdin。
    輸入數據已經在stdin上,不需要重定向。

  3. sed clean filter中的程序使用r命令訪問另一個文件。
    過濾器似乎從工作樹的根目錄運行,但我不確定這是否有保證。

  4. sed命令在清潔過濾器使用-n。它的唯一輸出將是ankhsvnsection文件的內容(假設輸入有一個Global行)。

  5. 某些版本的sed(至少在(舊)BSD版本的Mac OS X)不允許r命令(即空間的清潔過濾器的的sed程序的文件名ankhsvnsection後後的空白)。

添加,更改或刪除過濾器,你可能會需要觸摸後,修改或刪除你的工作樹中的文件之前,Git會應用過濾器。Git的索引記錄工作樹文件的修改時間;如果他們沒有改變,那麼Git會將git checkout -- filegit add file轉換爲無操作。

如果您想查看索引的實際內容(例如,查看清潔過濾器生成的內容),可以使用git show :0:path/from/repo/root/to/file。您通常不能使用git diff,因爲它也適用過濾器。

這些工作對我來說:

git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d'" 
git config filter.SourceControlProvider.clean "sed -e '/^Global\$/ r ankhsvnsection'" 
+0

+1發佈工作線。其餘包括一些nitpicks或長鏡頭(*一些seds可能不喜歡的文件名後的空間*?c'mon ...沒有sed甚至會收到空間,除非報價?) – sehe 2011-03-23 10:40:16

+2

@sehe:我的* sed *抱怨在問題的清潔過濾器中使用的程序:'sed:1:「/^Global \ $/r ankhsvnse ...」:讀取命令後的空白。唯一的「遠射」是關於過濾器的警告的警告;一切都需要得到過濾器正常工作(無論如何我的系統上)。 – 2011-03-23 19:58:08

+0

我現在明白了。你所指的文件名是'r'命令的操作數。是的,你無法通過空間追隨。採取的點。 – sehe 2011-03-23 21:01:53