2011-04-27 68 views
2

我一直在閱讀和尋找解決方案几天,但沒有找到任何適合我的需求。使用SVN(或git)自動提交文件修改?

我們經常更新由設計師和開發人員更新的網站,大多數時候他們不會對SVN進行更改。

我在尋找持續集成類型的解決方案,其中當登臺服務器上的「版本化」文件得到更新時,它會自動提交給SVN。

我看過的CruiseControl和其他工具不這樣做;有沒有一種工具可以實現這個或者我們可以使用的更好的過程?

感謝您的幫助!

Chris

+1

看到這個問題上程序員:[讓非程序員參與的簡單方法(即設計師)使用版本控制?](http://programmers.stackexchange.com/questions/43819/easy-way-of-engaging-non-programmers-ie-designers-into-using-version-control) – CharlesB 2011-04-27 17:26:04

回答

5

我真的很喜歡你說「更好的過程」,因爲答案是肯定的。

讓你的設計師和每個人都從回購工作。如果你選擇SVN或者git或者別的什麼都沒關係,但是要做到「權威」的副本。這樣做最終會讓你頭痛,因爲你可以清楚地記錄所有的變化,並且可以隨時恢復。

我已經安裝了網頁設計商店只有環境是一個系統,相反你提出什麼樣的方式,它的工作原理是這樣的:

  • 所有設計師對網站的簽出份工作,並進行修改和根據需要提交/更新。
  • 在提交時,存儲庫將站點的副本推送到登臺服務器,登臺服務器的配置與生產幾乎相同。
  • 如果該站點正在進行分段工作,則非常有信心它可以在實時服務器上工作。
  • 準備好後,登臺服務器上的站點副本可以複製到現場,現在您已經以非常負責任的方式更新了您的站點,並且您有所有變更的歷史記錄。 (對於這個我喜歡使用rsync,你可以讓它工作,但你認爲合適)

我希望這可以幫助你考慮一下你的過程。如果你真的不想改變你的過程,你可以設置一個cron,每隔幾分鐘運行一次,並添加/提交所有已更改的文件,並且應該可以工作。但我不喜歡這樣,因爲現在你沒有有意義的提交信息,而且改變歷史也可能沒有意義。當人們在工作並保存文件時,他們沒有意識到他們正在提交什麼內容,因此很可能現在版本庫中的修訂版本已經處於崩潰狀態,現在如何找到未被破壞的修訂版本?選擇「自動化」提交顯然不是最乾淨的解決方案。

+0

是的,這似乎是最好的選擇。這就是我在另一家公司所做的事情,但後來我被貶爲了=)希望設計師能夠確信遵循這一點,將佈局好處。謝謝@ctcherry! – 2011-04-29 05:24:00

2

我相信(雖然我沒有嘗試過),你可以爲看門狗(http://packages.python.org/watchdog/)寫一個觀察者,它會爲你做提交。

但是,我同意ctcherry,你將得到很多保存在一個破碎的狀態。你真的需要改變你的過程。

+0

是的,我想我會推動描述的過程ctcherry。 – 2011-04-29 05:20:36

2

CruiseControl的和其他工具,我 看着不這樣做

我不敢苟同。如果您要配置一個<exec>塊來調用SVN命令行工具來爲您提交代碼,那麼這不會完全符合您的要求嗎?您可以使用<filesystem>節點來確定哪些文件被修改。

現在,儘管你可以這樣做,但我也同意@ctcherry的觀點,如果你直接用這種方式進行生產,這可能會導致破壞代碼。

2

聽起來像你想使用WebDAV在Subversion中進行自動版本更新。 Subversion and WebDAV

我以前使用過這種方法。這是很好的,你可以設置它像一個Windows/Linux網絡共享。非技術人員只是將其視爲存儲文件的網絡驅動器。每當用戶保存文檔/文件時,都會默默承諾。

Git可能有類似的東西,但我沒有經驗。

+0

謝謝@SuperJames! – 2011-04-29 05:21:37

0

開發人員網站上,你可以開發支持這件事情一個工具,你可以看到下面的代碼,下面的代碼支持,你如何讓汽車在SVN提交,看看:)

任何意見或提問,留下您的評論,我們可以討論一下

參考代碼在這裏:

public static string AppTitle = "Auto Commit"; 

    // AddFileToSVN 
    public static bool AddFileToSVN(string strLogFile, string path, 
             Timer myTimer) 
    { 
     try 
     { 
      using (SharpSvn.SvnClient client = new SharpSvn.SvnClient()) 
      { 
       Collection changeFiles = new 
           Collection(); 
       client.GetStatus(path, out changeFiles); 

       foreach (SharpSvn.SvnStatusEventArgs changeFile in 
                changeFiles) 
       { 
        if (changeFile.LocalContentStatus == 
             SharpSvn.SvnStatus.Missing) 
        { 
         client.Delete(changeFile.Path); 
         WriteLog(strLogFile, changeFile.Path + " Removed - 
           Missing files (that are not in filesystem)"); 

         myTimer.Enabled = false; 
        } 

        if (changeFile.LocalContentStatus == 
            SharpSvn.SvnStatus.NotVersioned) 
        { 
         client.Add(changeFile.Path); 
         WriteLog(strLogFile, changeFile.Path + " Added - 
            This file is new in filesystem!"); 

         myTimer.Enabled = false; 
        } 
       } 
       return true; 
      } 
     } 
     catch (Exception ex) 
     { 
      myTimer.Enabled = true; 
      WriteLog(strLogFile, ex); 
      return false; 
     } 
    } 

    // CommitToSVN 
    public static bool CommitToSVN(string strLogFile, string workingcopy, 
              string message, Timer myTimer) 
    { 
     using (SharpSvn.SvnClient client = new SharpSvn.SvnClient()) 
     { 
      SharpSvn.SvnCommitArgs args = new SharpSvn.SvnCommitArgs(); 

      args.LogMessage = message; 
      args.ThrowOnError = true; 
      args.ThrowOnCancel = true; 

      try 
      { 
       myTimer.Enabled = true; 
       return client.Commit(workingcopy, args); 
      } 
      catch (Exception ex) 
      { 
       myTimer.Enabled = true; 
       WriteLog(strLogFile, ex); 
       return false; 
      } 
     } 
    } 

查看更多信息:從here

相關問題