2013-05-13 29 views

回答

3

"clean filter"用於特定文件是另一種方法。

更新爲例,由於要求:

添加一個「乾淨」的過濾器,以本地資源庫的配置,其中包括一個呼叫到sed。這可能是一個shell腳本或向耗費的標準輸入數據和處理數據寫到標準輸出的任何程序的路徑:

$ git config --add filter.classify.clean \ 
    'sed -e '\''s!\<\(personal_stuff\s\+=\s\+\)"[^"]\+"!\1"SECRET"!'\' 

現在就註冊,應用於其名稱匹配*.rb文件我們的過濾器:

$ cat >.gitattributes 
*.rb filter=classify 
^D 

創建幾個測試文件:

$ cat >test.rb 
aaa 
bbb 
     personal_stuff = "sensitive data" 
ccc 
^D 
$ cat >test.txt 
aaa 
xxx 
personal_stuff = "super secret" 
yyy 
^D 

新增並提交它們:

$ git add test.* 
$ git commit -q -m 'root commit' 
... 

現在看看發生了什麼事的test.rb的內容,那就是,什麼是它的斑點在剛剛錄製提交包含:

$ git cat-file -p HEAD 
tree 7adaac5cc23c69ff9459635d666ca63ffb9757aa 
author Konstantin Khomoutov <[email protected]> 1368453302 +0400 
committer Konstantin Khomoutov <[email protected]> 1368453302 +0400 


root commit 
$ git cat-file -p 7adaa 
100644 blob e49630236eb74d8c7ccbcccc83c7c18af0cb4b96 test.rb 
100644 blob aecd9ade78e18d5b5ded99a1e41cf366fa52e619 test.txt 
$ git cat-file -p e496302 
aaa 
bbb 
     personal_stuff = "SECRET" 
ccc 

驗證這並沒有影響到工作樹:

$ cat test.rb 
aaa 
bbb 
     personal_stuff = "sensitive data" 
ccc 
+0

你能提供一個如何做到這一點的例子嗎? – 2013-05-13 09:15:47

+0

@ZachLatta,做到了 - 看到更新。 – kostix 2013-05-13 14:07:43

+0

很好的回答! (額外的字符) – 2013-05-13 16:33:28

1

一個解決方案是將您的機密信息移動到將被忽略的外部文件。

有忽略的git文件兩種方式:

在你的情況下,更靈活的解決方案將是:

  1. 用假人員創建空文件NNAL的東西(如password = "mypassword1234"或任何...)
  2. 提交和推送該文件
  3. 忽略它即將成爲修改與git update-index --no-assume-unchanged your_file
+0

將機密信息移動到外部文件是不可能的,因爲這不是語言不可知的。該解決方案應適用於任何文件,無論語言或語法如何。您的靈活解決方案將無法正常工作,因爲我希望在向其添加保密信息後能夠更改文件。 – 2013-05-13 09:14:37

+0

因此,您只希望在不改變代碼的情況下才能掩蓋您的機密信息? – aymericbeaumet 2013-05-13 09:21:20

+0

這就是目標,是的。 – 2013-05-13 14:15:19

1

您可以編寫自己的pre-commit hook。這個鉤子會掃描你的代碼,如果它能找到它不喜歡的東西,就會拒絕提交。

寫入實際掛鉤可能是一個挑戰,您應該能夠找到some示例online

+0

我認爲他想在本地保留他的機密信息而不發送給服務器,不要阻止提交/推送過程。 – aymericbeaumet 2013-05-13 09:00:28

0

如果您不能使用.gitignore,因爲您需要在同一個文件中進行並行更改(如您的評論中所示),那麼一個選項是git add -p使用此選項可以相應地添加或跳過。

這裏使用上面的git命令的問題是,它會更像是一個手動過程。我想你可能找不到任何其他自動化方法來解決你的問題。

1

使用'.gitattributes'和'.gitfilters'。這裏是'rcs-keywords'的例子。你會遵循相同的結構,但爲你的敏感數據使用過濾器。

你的屬性的文件,從文件名匹配的地圖來過濾,因爲這樣的:

# .gitattributes 
# Map file extensions to git filters 
*.h filter=rcs-keywords 
*.c filter=rcs-keywords 

你.gitfilters文件推行「清潔」和「塗抹」過濾器。對於上述「RCS-關鍵字的過濾器是這樣的:

$ ls .gitfilters/ 
rcs-keywords.clean* rcs-keywords.smudge* 

的「乾淨」濾波器去除提交之前的東西; '污跡'過濾器在結帳時加回東西

過濾器是任何腳本。同樣,對於 'RCS-關鍵字' 的 '乾淨' 過濾器看起來像:

#!/usr/bin/perl -p 
s/\$Id[^\$]*\$/\$Id\$/; 
s/\$Date[^\$]*\$/\$Date\$/; 

因此RCS IdDate信息將被刪除。相關的「污點」過濾器添加信息回。

最後,您配置的git爲

git config --add filter.rcs-keywords.clean .gitfilters/rcs-keywords.clean 
git config --add filter.rcs-keywords.smudge .gitfilters/rcs-keywords.smudge 

對於你的情況,清潔過濾器軸的敏感數據和塗抹過濾器添加回。