2012-06-27 48 views
18

我使用git來管理服務器上的網站。當我推送到服務器Git正在改變我的文件的權限

我有下面所示

[email protected]:myapp$ ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' 
total 16 
755 [email protected] 18 thomas staff 612 Jun 13 15:35 application 
755 [email protected] 11 thomas staff 374 Jun 12 16:25 assets 
644 [email protected] 1 thomas staff 6399 Jun 22 11:45 index.php 
755 [email protected] 10 thomas staff 340 May 14 15:22 system 

本地資源庫我有一個使用post-receive在apache的前面指向回購服務器上的純倉庫。 Apache的public文件夾內容不在裸倉庫中。

[email protected]:/srv/public/myapp# ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' 
total 20 
700 drwx------ 15 root root 4096 Jun 27 11:31 application 
700 drwx------ 10 root root 4096 Jun 27 11:31 assets 
600 -rw------- 1 root root 6399 Jun 27 11:31 index.php 
700 drwx------ 8 root root 4096 Jun 27 11:31 system 

這是造成破壞我的代碼在網絡服務器上。

我該如何解決這個問題?如果這有什麼不同,我使用gitolite。

git的服務器配置文件

[core] 
     repositoryformatversion = 0 
     filemode = true 
     bare = true 
+2

您是否檢查過用於創建/ srv/public/myapp repo的用戶的umask?什麼在Git配置?與文件模式相關的任何內容都改變了嗎? – bcelary

+0

我一直在搞文件模式,我在一個地方工作,現在它是'真正'。不知道什麼是「揭密」。我有一個我用gitolite設置的git用戶。我更新了帖子。 – ThomasReggi

+0

請參閱[這個問題](http://stackoverflow.com/questions/1071241/how-does-git-handle-folder-permission)。 – vergenzt

回答

19

This thread post提供了一個很好的解釋:

這是由設計。儘管git數據結構在技術上可以在其樹中存儲 unix模式位,但它早在git的歷史記錄 中發現,除了簡單的可執行位之外,其他任何內容都被認爲是 對於git的正常使用情況(即存儲代碼的人員 或存儲庫中的其他共享文件)。

我們可以添加一個配置選項來尊重文件模式,但它通常被認爲是不值得的。它僅解決 一般元數據問題的一部分,因爲它省略了所有者和組名稱或ID,如 以及擴展的元數據(如ACL)。

如果模式是對你很重要,該建議的修復是一個:

  1. 使用像「metastore」,可以從git的鉤子被調用,並且 工具將保存和恢復文件權限在 存儲庫中跟蹤的文件。請注意,當使用這樣的工具時,在保護文件時存在競爭條件(即,git將創建文件爲 644,然後Metastore會將其更正爲600;同時,有人可能會讀取您的文件)。

  2. 取決於你存儲什麼,它可能是有意義的保持 你的資料庫在另一個目錄中,通過權限保護, 然後使用一個單獨的工具從倉庫裏 文件部署到它們的最終位置(例如,一個Makefile或其他安裝 工具)。

+4

因爲它在網上,我需要持久的權限。我可以在我的post-receive hook中添加一行,將工作目錄(不是裸存儲庫)中的所有文件和文件夾更改爲正確的權限,文件夾「755」和文件「644」。 – ThomasReggi

+2

如果這符合您的需求,那麼是的。關鍵是Git不會爲你做。如果你想要特定的權限,你需要手動完成。 – vergenzt

+1

@ThomasReggi你可以在.profile腳本中設置'umask 022'來創建新文件時應用755和644,比如從Git中提取文件 –

相關問題