2015-12-22 20 views
3

我的基於Perforce的項目支持Linux和Cygwin平臺使用相同的shell腳本(例如build_project.sh)。但Perforce將文本文件的行結尾默認爲本地平臺(Docs)。這導致.sh腳本中的\r\n換行符在Cygwin上失敗。Perforce每個文件的結尾

一些我認爲到目前爲止的想法:

  1. 有沒有一種方法,使Cygwin的接受\ r \ n個文件?(無需運行dos2unix,文件將作爲只讀文件提取)。

  2. 有沒有辦法將特定的文件設置爲文本,但是對於每個人來說,Unix行結尾?(我猜測,「沒有」,但認爲我會檢查。)

  3. 當然,我可以設置整個工作區的行結束\n(UNIX)中。但是,這使得Windows客戶端不滿意.bat文件是\n而不是\r\n。此外,如果設置是每個工作區(我無法調出),那麼對於新的Windows用戶,工作區設置稍微難一些,因爲他們必須設置該選項。

  4. .sh文件設置爲「二進制」,但後來我們在這些文件上丟失了文本差異。 有沒有解決方法?這是常見的(良)黑客?

這是一個相當小的挑剔,但我懷疑你們中的一些有BKM此模式。

謝謝。

編輯:克雷格在this question的答案似乎表明,如果它們最初是以這種方式提交的話,那麼使用Unix行結尾將僅僅保留具有\r\n的文件。

編輯:要強制bash(即Cygwin)接受帶有\r\n結尾的文件,可以在腳本中指定set -o igncr。如果希望Cygwin用戶可能不是非常熟悉Unix的人(我的情況),或者出於某種其他原因無法在下面的解決方案中全局強制觸發器時,這很好。

回答

3

我相信,當您安裝Cygwin時,您可以將其配置爲使用Windows行尾。除此之外,儘管如此:

如果你對所有人使用「unix」LineEnd,那麼你所有的文本文件都會有自己的內部一致的行尾(但不一定與客戶端平臺一致)。這是因爲Windows文件最終將\ r作爲該行內容的一部分,因此當以「unix」格式同步時,它們將具有\ r \ n結尾。

要做到這一點時需要注意的是混合和匹配LineEnd設置 - 如果某個用「win」或「local」LineEnd同步的同一文件,現在它們有\ r \ r \ n結尾!所以,如果你想要使用每個文件行結束計劃,請確保EVERYONE使用「unix」作爲它們的LineEnd。使用觸發器很容易,例如:

Triggers: 
    form-in client "sed -i %quote%s/LineEnd:.*/LineEnd: unix/%quote% %formfile%"