2011-03-23 154 views
1

我有一個目錄的文件可能會或可能不會每天都在自動化過程中更改。該目錄包含一堆代表單個映射的Oracle倉庫構建器mdl文件。自動化的oracle進程根據oracle模塊中存在的映射創建mdl文件。在oracle進程運行之前,不可能知道該目錄將包含哪些文件。提交文件夾更改爲顛覆

我需要提交目錄中的所有文件進行顛覆後,該進程填充該文件夾。如果昨天存在的文件已經消失(因爲oracle映射不再存在),那麼該文件也應該從svn中刪除。如果在oracle中創建了一個新映射,並且因此新文件已添加到該文件夾​​中,則應將新文件添加到svn。如果映射已更改並因此修改了新文件,則修改應該提交給svn。

所有這些都需要作爲自動化過程的一部分進行,因此必須使用svn命令行指令來同步文件夾更改與svn。

是否有一個簡單的svn命令(或命令序列)將同步文件夾而不是與svn回購文件?

+0

沒有簡單的解決方案。只有腳本。在我看來,這些部分生成的代碼是生成的,不應該在版本控制下,除了生成部件的源。 – khmarbaise 2011-03-23 08:38:57

+0

個別映射必須在版本控制之下,因爲重要的是能夠將各個映射回滾到特定修訂。如果只有創建生成序列的腳本受源代碼控制,則映射本身不會進行版本控制,也不會解決問題。 – grenade 2011-03-23 08:41:48

+0

但這並不意味着oracle模塊或多或少是「源代碼」並且mdl文件是由它們創建的嗎? – khmarbaise 2011-03-23 08:43:41

回答

2

假設我們有一個文件夾樹這樣的:

. 
├── autocommit.sh 
├── dailysnapshot/ 
└── workingcopy/ 

dailysnapshot /店MDL其每日更新的文件。 workingcopy /是你的Subversion版本庫的工作副本 請注意,這個腳本只能提交工作副本下1級的更改,如果工作副本中有子文件夾,那麼你需要改進腳本。

作出這樣的安排是一個crontab只要你想打電話autocommit.sh

用法:

autocommit.sh [快照目錄] [工作目錄] [SVN用戶名] [SVN密碼]

autocommit.sh來源:

#!/bin/bash 
SNAPSHOT=`cd $1;pwd` 
WORKINGDIR=`cd $2;pwd` 
USERNAME="$3" 
PASSWORD="$4" 

function CheckModifiedAndNew() {  
    cd $1 
    for f in $(find .) 
    do 
    if [ -a $f ]; then 
    f=${f:2} 
     if [[ -n $f ]]; then 
      SnapshotFile="$1/$f" 
      WorkingFile="$2/$f"   
      if [[ -f $WorkingFile ]];then 
       if cmp $SnapshotFile $WorkingFile &> /dev/null; then 
        # 2 files are identical 
        echo &> /dev/null "" #do nothing here 
       else 
        echo "[Modified] $WorkingFile" 
        cp -f $SnapshotFile $WorkingFile 
       fi 
      else 
       cp -f $SnapshotFile $WorkingFile 
       echo "[Added]  $WorkingFile" 
       svn add $WorkingFile 
      fi 
     fi 
    fi 
    done 
} 

function CheckRemove() { 
    cd $2 
    for f in $(find .) 
    do 
    if [ -a $f ]; then 
     f=${f:2} 
     if [[ -n $f ]]; then 
      SnapshotFile="$1/$f" 
      WorkingFile="$2/$f"  
      if [[ -f $SnapshotFile ]];then 
       echo &> /dev/null "" #do nothing here 
      else 
       echo "[Removed] $WorkingFile" 
       svn remove $WorkingFile 
      fi 
     fi 
    fi 
    done 
} 

function CommitAllChanges() { 
    cd $1 
    svn commit . --message="daily auto commit" --username=$USERNAME \ 
               --password=$PASSWORD \ 
               --non-interactive \ 
               --no-auth-cache            
} 

CheckModifiedAndNew $SNAPSHOT $WORKINGDIR 

CheckRemove $SNAPSHOT $WORKINGDIR 

CommitAllChanges $WORKINGDIR 

自定義儘可能使它適合您的問題。

1

沒有簡單的解決方案可用。然而,這是一個可以通過腳本完成的任務(例如使用bash)。

這個想法是你有你的導出目錄(你從oracle導出mdl文件的地方)和你的svn工作拷貝在不同的目錄中。更新需要2個步驟:

  1. 你迭代你的svn工作副本中的所有文件,看它們是否存在於export dir中。如果在導出文件中存在,你簡單地將移動到它到你的svn工作目錄,如果不是你的話svn刪除工作副本中的文件。
  2. 導出目錄中的所有其餘文件都是新的。將它們移動到svn工作副本然後簡單地svn add他們。

完成此操作後,您將提交這些更改(svn commit)。這一點在腳本中不難實現。

1

您可以嘗試WebDav and autoversioning - 即通過「網絡共享」暴露的顛覆回購。寫入和新文件將被添加到存儲庫中,我不確定是否也會處理刪除操作,但它不會顯得太不切實際。

WebDAV存在一些問題,您應該知道:它有點瑣碎,它不會在1次提交所有文件(因爲每個文件都會單獨編寫),但是您可能會得到足夠的結果。

另一種方法是以非常相似的方式公開回購的文件系統驅動程序。