SVN 创建分支

2种方法:

创建分支之前一定要先更新到最新版本。

1.你用tortoiseSVN点版本库浏览,在需要建立分支的路径(比如trunk)点copy to + 新分支名称(注意:必须与trunk不能同名,你可以新建一个名称比如branch),然后在分支文件夹的根目录update。

2.tortoiseSVN点版本库浏览,你在需要创建的路径下右键tortoiseSVN 选择create folder 然后创建新路径名称(文件夹)然后把主干或者其他分支路径的代码(拉分支这种情况估计想并行开发)导入到这个路径下就可以了,然后在分支文件夹的根目录update。

创建分支是否成功,在分支文件夹里面 TortoiseSVN  ---->版本库浏览器  定位的是分支路径那就对了,如果还是主干路径那创建分支就有问题了。

注意:1、如果分支目录在没有分支的情况下check out下来的项目,这时候工作副本对应版本库的路径仍为原来对应的主干的目录。所以在客户端文本夹中删除之后 再从服务器Update分支的项目。不能用客户端SVN delete,这样会删除主干上的项目。


2、如果是多个项目,只保留几个项目做分支,那就从版本浏览器中分支的项目右键删除,不能从本地svn delete,这样会删除主干上的项目。


修改相关文件项目名,这样就能引入eclipse 了

/gjmj/mallv2/branchs/gjmj_20141110/shop/.classpath
/gjmj/mallv2/branchs/gjmj_20141110/shop/.project
/gjmj/mallv2/branchs/gjmj_20141110/shop/WebRoot/WEB-INF/web.xml
/gjmj/mallv2/branchs/gjmj_20141110/shop/config/boot.xml
/gjmj/mallv2/branchs/gjmj_20141110/shop/config/ui/path.xml


下面修改相关文件项目名的代码根据具体需要改动

import java.io.BufferedReader;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 1、修改多个项目的路径,以便导入eclipse
 * 2、全部替换gjmj_20141110为分支文件夹
 * @author Coco
 *
 */
public class FileContentReplace {
 private static String REPLACE_SRC_FILE = "E:\\workspaces\\gjmj\\mallv2\\branchs\\gjmj_20141110";
 private static String REPLACE_EXCLUDE_FILE = "E:\\Workspaces\\gjmj\\mallv2\\branchs\\gjmj_20141110\\core\\WebRoot\\sr;E:\\Workspaces\\gjmj\\mallv2\\branchs\\gjmj_20141110\\core\\WebRoot\\upload;E:\\Workspaces\\gjmj\\mallv2\\branchs\\gjmj_20141110\\core\\WebRoot\\WEB-INF\\lib;toruk.xml";
 
 private static String REPLACE_CONTENT = "gjmj_mallv2->gjmj_20141110;E:/Workspaces/gjmj/mallv2/project/->E:/Workspaces/gjmj/mallv2/branchs/gjmj_20141110/;E:/workspaces/gjmj/mallv2/project/->E:/workspaces/gjmj/mallv2/branchs/gjmj_20141110/";
 
 public static List<String> EXCLUDE_FILE_LIST = null;
 
 public static Map<String,String> getReplaceMaping()  {
   Map<String,String> map = new HashMap<String,String>();
   if(REPLACE_CONTENT!=null){
     String[] repContentArr = REPLACE_CONTENT.split(";");
     for(String repMap:repContentArr){
       String[] arg = repMap.split("->");
       if(arg.length!=2){
         throw new RuntimeException(repMap+"不正确");
       }else{
         map.put(arg[0], arg[1]);
       }
     }
   }
   return map;
 }
 
 public static List<String> excludeFileList(){
   if(EXCLUDE_FILE_LIST==null){
     EXCLUDE_FILE_LIST = new ArrayList<String>();
     if(REPLACE_EXCLUDE_FILE!=null){
       String[] strArr = REPLACE_EXCLUDE_FILE.split(";");
       for(String str:strArr){
         EXCLUDE_FILE_LIST.add(str.trim());
       }
     }
     return EXCLUDE_FILE_LIST;
   }else{
    return EXCLUDE_FILE_LIST;
   }
 }
 public static void handFile(File infile,String fromCharSet,String toCharSet) throws Exception{
      if(infile.getName().equals(".svn")){
        return;
      }
      if(infile.getName().contains("!")){
        return;
      }
      for(String excludeFile:excludeFileList()){
        if(infile.getPath().toLowerCase().contains(excludeFile.toLowerCase())||infile.getName().equals(excludeFile)){
          return;
        }
      }
      
      BufferedReader in = new BufferedReader(new InputStreamReader(
      new FileInputStream(infile), fromCharSet));
      String reading;
      String  content = "";
      while ((reading = in.readLine()) != null) {
        content +=reading+"\r\n";
      }
      boolean flag = false;
      Map<String,String> replaceMapping = getReplaceMaping();
      if(replaceMapping!=null){
        Set<Map.Entry<String, String>> replaceEntrys =   replaceMapping.entrySet();
        for(Iterator<Map.Entry<String, String>> it = replaceEntrys.iterator();it.hasNext();){
          Map.Entry<String, String> entry = it.next();
          String key = entry.getKey();
          if(content.contains(key)){
            flag = true;
          }
        }
      }
      
      if(flag){
        File outfile = new File(infile + ".tmp");
        PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(outfile), toCharSet)));
        
        if(replaceMapping!=null){
          Set<Map.Entry<String, String>> replaceEntrys =   replaceMapping.entrySet();
          for(Iterator<Map.Entry<String, String>> it = replaceEntrys.iterator();it.hasNext();){
            Map.Entry<String, String> entry = it.next();
            String key = entry.getKey();
            String value = entry.getValue();
            content = content.replaceAll(key, value);
          }
          System.out.println("替换文件:"+infile.getPath());
        }
        
        out.println(content);
        out.flush();
        out.close();
        in.close();
        infile.delete();
        outfile.renameTo(infile);
      }else{
        in.close();
      }
      
    
  }
 
 
 
  public static void main(String[] args) throws Exception {
     replaceFile(new File(REPLACE_SRC_FILE),"UTF-8","UTF-8");
  }


  public static void replaceFile(File filePath,String fromCharSet,String toCharSet) throws Exception{
    if(filePath.exists()==false){
      new RuntimeException(filePath.getPath()+"不存在");
    }
    
    if(filePath.getName().equals(".svn")){
      return;
    }
    for(String excludeFile:excludeFileList()){
      if(filePath.getPath().toLowerCase().contains(excludeFile.toLowerCase())){
        return;
      }
    }
    
    if(filePath.isDirectory()){
      File[] childFiles = filePath.listFiles();
      if(childFiles!=null){
        for(File childFile:childFiles){
          if(childFile.isFile()){
            handFile(childFile,fromCharSet, toCharSet);
          }else{
            replaceFile(childFile,fromCharSet, toCharSet);
          }
        }
      }
    }else{
      handFile(filePath,fromCharSet, toCharSet);
    }
  }
}


<think>好的,我现在需要回答用户关于如何在SVN创建分支的最佳实践的问题。首先,我得回忆一下SVN的基本操作和分支管理的相关知识。根据用户提供的引用内容,特别是引用[2]和引用[4],用户可能已经了解了一些基础的SVN操作,比如checkout和添加文件,但需要更详细的步骤来创建分支。 首先,我应该明确SVN创建分支的基本方法。根据引用[4],创建分支可以通过`svn copy`命令,将主干(trunk)复制到branches目录下的一个新路径。接着,使用`svn switch`来切换到新创建分支进行开发。这可能涉及到具体的命令示例,比如`svn copy http://svn.example.com/repo/trunk http://svn.example.com/repo/branches/feature-branch -m "创建功能分支"`。这一步需要确保用户理解URL路径的正确写法,以及提交日志的重要性。 然后,最佳实践部分可能需要包括分支命名的规范,比如使用有意义的名称,保持主干稳定,定期合并等。这些内容在引用[4]中提到的步骤之后,可能需要进一步展开,例如引用[2]中的checkout操作示例,可以结合到分支切换的步骤中。 还需要考虑用户可能遇到的问题,比如如何处理分支的合并,避免冲突,或者如何管理多个分支。但根据用户当前的问题,主要集中在创建分支的最佳实践,所以应该先聚焦于此。 接下来,我需要检查是否有遗漏的步骤或注意事项。例如,创建分支后是否需要立即切换,或者是否推荐在分支上进行所有开发工作。引用[4]提到在步骤2中开发和提交,所以可能需要强调在分支上的开发流程。 另外,引用[2]中提到了使用TortoiseSVN的图形界面进行操作,但用户的问题可能更多关注命令行操作,因为引用了LINUX下的SVN命令(引用[3])。所以可能需要同时提供命令行和图形界面的方法,但用户的问题更倾向于最佳实践,可能更通用,不限于特定工具。 最后,确保回答结构清晰,分步骤说明,并引用相关的引用来源,比如在步骤末尾添加[^4]或[^2]等标识。同时,生成的相关问题需要与分支管理相关,比如如何合并分支或解决冲突,这样可以引导用户进一步了解后续操作。</think>在SVN创建分支的最佳实践可分为以下步骤,结合命令行和图形界面操作说明: ### 一、创建分支的核心步骤 1. **使用`svn copy`命令复制主干** 将主干(trunk)复制到分支目录,语法为: ```bash svn copy http://svn.example.com/repo/trunk http://svn.example.com/repo/branches/feature-branch -m "创建功能分支" ``` 此操作直接在版本库中创建分支,无需本地副本。 2. **切换工作副本到新分支** 通过`svn switch`切换到分支路径: ```bash svn switch http://svn.example.com/repo/branches/feature-branch ``` 此时本地文件将关联到分支,后续修改仅影响该分支。 --- ### 二、图形化操作(以TortoiseSVN为例) 1. **右键目录选择“Branch/Tag”** 在资源管理器中右键点击本地副本,选择“TortoiseSVN > Branch/Tag”。 2. **填写分支路径和日志** 在弹出窗口中指定目标分支路径(如`branches/feature-branch`),并添加注释[^2]。 --- ### 三、最佳实践建议 1. **分支命名规范** - 使用有意义的名称,例如`feature-login-module`或`bugfix-issue123`。 - 避免使用日期或开发者姓名作为分支名。 2. **保持主干稳定** - 主干(trunk)应始终处于可发布状态。 - 新功能开发、实验性代码应在分支中完成。 3. **定期合并主干更新** ```bash svn merge http://svn.example.com/repo/trunk ``` 避免分支与主干差异过大导致合并冲突。 4. **分支生命周期管理** - 功能合并后及时删除过期分支。 - 通过`svn delete`命令清理废弃分支。 --- ### 四、验证分支创建 执行`svn info`查看本地副本URL,确认路径指向分支: ```bash URL: http://svn.example.com/repo/branches/feature-branch ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值