SVN版本问题:This client is too old to work with working copy

来源:互联网 发布:淘宝开店多少钱 编辑:程序博客网 时间:2024/05/21 06:50
【问题描述】:MyEclipse插件版本1.4,客户端TortoiseSVN 1.6.6,用客户端commit代码之后,无法在MyEclipse下对工程就行update等操作,提示错误信息:This client is too old to work with working copy '.'; please get a newer Subversion client

【问题分析】:网络一气搜集之后,发现问题所在:.svn目录,里面保存着svn需要的一些版本信息,用TortoiseSVN去操作,会在.svn里增加一些文件。如果TortoiseSVN的版本比插件版本要高,那么再回到低版本去工作,就会有兼容性错误,因为老的客户端无法识别那些。

【解决方法】:

方案1(未试验,理论可行):
在线更新安装插件
help->sofeware updates-> find and install

方案2(测试可行):
一、下载:change-svn-wc-format.py(见附件) ,这是一个Python做的script,所以需要先下载Python
注意:1)从目前来看,最好使用Python 2.6,如果是用最新的3.0版本会出现问题。 比如无法打开Script,出现异常等等。2)安装后在环境变量的path中追加python安装路径:"C:/Python26"
二、1)把change-svn-wc-format.py放入C盘根目录,运行-->cmd-->cd C:/
2)执行修改:
 C:/>change-svn-wc-format.py E:/work/sadapter 1.4 --force

参数说明:第一个change-svn-wc-format.py是执行脚本,第二个E:/work/sadapter是工程路径,第三个1.4是要修改到的版本,第四个--force不是必须的,在执行失败的情况下可以加入此参数。
3)结果:一阵processing:
引用
……Checking whether WC format can be converted
Writing WC format
Converted WC at 'E:/work/sadapter' into format 8 for Subversion 1.4

再去MyEclipse下更新done:
引用
……    A  E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/order/orderContext.xml
    D  E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custRouteContext.xml
    D  E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custInfo.xml
    D  E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/custAcctContext.xml
    U  E:/work/sadapter/src/main/resources/efs/sadapter/config/spring/contract/contractContext.xml
    U  E:/work/sadapter/src/main/filter-resources/efs/sadapter/config/spring/applicationContext.xml
    Updated to revision 1235.
    ===== File Statistics: =====
    Deleted: 19
    Added: 14
    Updated: 17
  • change-svn-wc-format.rar (4.7 KB)

或者将下列代码保存成change-svn-wc-format.py文件,chmod +x change-svn-wc-format.py修改执行权限,直接执行:sudo ../change-svn-wc-format.py kernel_imx 1.5

01.#!/usr/bin/env python   02.#   03.# change-svn-wc-format.py: Change the format of a Subversion working copy.   04.#   05.# ====================================================================   06.#    Licensed to the Apache Software Foundation (ASF) under one   07.#    or more contributor license agreements.  See the NOTICE file   08.#    distributed with this work for additional information   09.#    regarding copyright ownership.  The ASF licenses this file   10.#    to you under the Apache License, Version 2.0 (the   11.#    "License"); you may not use this file except in compliance   12.#    with the License.  You may obtain a copy of the License at   13.#   14.#      http://www.apache.org/licenses/LICENSE-2.0   15.#   16.#    Unless required by applicable law or agreed to in writing,   17.#    software distributed under the License is distributed on an   18.#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY   19.#    KIND, either express or implied.  See the License for the   20.#    specific language governing permissions and limitations   21.#    under the License.   22.# ====================================================================   23.  24.import sys  25.import os  26.import getopt  27.try:  28.  my_getopt = getopt.gnu_getopt  29.except AttributeError:  30.  my_getopt = getopt.getopt  31.  32.### The entries file parser in subversion/tests/cmdline/svntest/entry.py   33.### handles the XML-based WC entries file format used by Subversion   34.### 1.3 and lower.  It could be rolled into this script.   35.  36.LATEST_FORMATS = { "1.4" : 8,  37.                   "1.5" : 9,  38.                   "1.6" : 10,  39.                   # Do NOT add format 11 here.  See comment in must_retain_fields   40.                   # for why.   41.                 }  42.  43.def usage_and_exit(error_msg=None):  44.  """Write usage information and exit.  If ERROR_MSG is provide, that 45.  error message is printed first (to stderr), the usage info goes to 46.  stderr, and the script exits with a non-zero status.  Otherwise, 47.  usage info goes to stdout and the script exits with a zero status."""  48.  progname = os.path.basename(sys.argv[0])  49.  50.  stream = error_msg and sys.stderr or sys.stdout  51.  if error_msg:  52.    stream.write("ERROR: %s/n/n" % error_msg)  53.  stream.write("""/ 54.usage: %s WC_PATH SVN_VERSION [--verbose] [--force] [--skip-unknown-format] 55.       %s --help 56. 57.Change the format of a Subversion working copy to that of SVN_VERSION. 58. 59.  --skip-unknown-format    : skip directories with unknown working copy 60.                             format and continue the update 61. 62.""" % (progname, progname))  63.  stream.flush()  64.  sys.exit(error_msg and 1 or 0)  65.  66.def get_adm_dir():  67.  """Return the name of Subversion's administrative directory, 68.  adjusted for the SVN_ASP_DOT_NET_HACK environment variable.  See 69.  <http://svn.apache.org/repos/asf/subversion/trunk/notes/asp-dot-net-hack.txt> 70.  for details."""  71.  return "SVN_ASP_DOT_NET_HACK" in os.environ and "_svn" or ".svn"  72.  73.class WCFormatConverter:  74.  "Performs WC format conversions."  75.  root_path = None  76.  error_on_unrecognized = True  77.  force = False  78.  verbosity = 0  79.  80.  def write_dir_format(self, format_nbr, dirname, paths):  81.    """Attempt to write the WC format FORMAT_NBR to the entries file 82.    for DIRNAME.  Throws LossyConversionException when not in --force 83.    mode, and unconvertable WC data is encountered."""  84.  85.    # Avoid iterating in unversioned directories.   86.    if not (get_adm_dir() in paths):  87.      del paths[:]  88.      return  89.  90.    # Process the entries file for this versioned directory.   91.    if self.verbosity:  92.      print("Processing directory '%s'" % dirname)  93.    entries = Entries(os.path.join(dirname, get_adm_dir(), "entries"))  94.    entries_parsed = True  95.    if self.verbosity:  96.      print("Parsing file '%s'" % entries.path)  97.    try:  98.      entries.parse(self.verbosity)  99.    except UnrecognizedWCFormatException, e:  100.      if self.error_on_unrecognized:  101.        raise  102.      sys.stderr.write("%s, skipping/n" % e)  103.      sys.stderr.flush()  104.      entries_parsed = False  105.  106.    if entries_parsed:  107.      format = Format(os.path.join(dirname, get_adm_dir(), "format"))  108.      if self.verbosity:  109.        print("Updating file '%s'" % format.path)  110.      format.write_format(format_nbr, self.verbosity)  111.    else:  112.      if self.verbosity:  113.        print("Skipping file '%s'" % format.path)  114.  115.    if self.verbosity:  116.      print("Checking whether WC format can be converted")  117.    try:  118.      entries.assert_valid_format(format_nbr, self.verbosity)  119.    except LossyConversionException, e:  120.      # In --force mode, ignore complaints about lossy conversion.   121.      if self.force:  122.        print("WARNING: WC format conversion will be lossy. Dropping "/  123.              "field(s) %s " % ", ".join(e.lossy_fields))  124.      else:  125.        raise  126.  127.    if self.verbosity:  128.      print("Writing WC format")  129.    entries.write_format(format_nbr)  130.  131.  def change_wc_format(self, format_nbr):  132.    """Walk all paths in a WC tree, and change their format to 133.    FORMAT_NBR.  Throw LossyConversionException or NotImplementedError 134.    if the WC format should not be converted, or is unrecognized."""  135.    for dirpath, dirs, files in os.walk(self.root_path):  136.      self.write_dir_format(format_nbr, dirpath, dirs + files)  137.  138.class Entries:  139.  """Represents a .svn/entries file. 140. 141.  'The entries file' section in subversion/libsvn_wc/README is a 142.  useful reference."""  143.  144.  # The name and index of each field composing an entry's record.   145.  entry_fields = (  146.    "name",  147.    "kind",  148.    "revision",  149.    "url",  150.    "repos",  151.    "schedule",  152.    "text-time",  153.    "checksum",  154.    "committed-date",  155.    "committed-rev",  156.    "last-author",  157.    "has-props",  158.    "has-prop-mods",  159.    "cachable-props",  160.    "present-props",  161.    "conflict-old",  162.    "conflict-new",  163.    "conflict-wrk",  164.    "prop-reject-file",  165.    "copied",  166.    "copyfrom-url",  167.    "copyfrom-rev",  168.    "deleted",  169.    "absent",  170.    "incomplete",  171.    "uuid",  172.    "lock-token",  173.    "lock-owner",  174.    "lock-comment",  175.    "lock-creation-date",  176.    "changelist",  177.    "keep-local",  178.    "working-size",  179.    "depth",  180.    "tree-conflicts",  181.    "file-external",  182.  )  183.  184.  # The format number.   185.  format_nbr = -1  186.  187.  # How many bytes the format number takes in the file.  (The format number   188.  # may have leading zeroes after using this script to convert format 10 to   189.  # format 9 -- which would write the format number as '09'.)   190.  format_nbr_bytes = -1  191.  192.  def __init__(self, path):  193.    self.path = path  194.    self.entries = []  195.  196.  def parse(self, verbosity=0):  197.    """Parse the entries file.  Throw NotImplementedError if the WC 198.    format is unrecognized."""  199.  200.    input = open(self.path, "r")  201.  202.    # Read WC format number from INPUT.  Validate that it   203.    # is a supported format for conversion.   204.    format_line = input.readline()  205.    try:  206.      self.format_nbr = int(format_line)  207.      self.format_nbr_bytes = len(format_line.rstrip()) # remove '/n'   208.    except ValueError:  209.      self.format_nbr = -1  210.      self.format_nbr_bytes = -1  211.    if not self.format_nbr in LATEST_FORMATS.values():  212.      raise UnrecognizedWCFormatException(self.format_nbr, self.path)  213.  214.    # Parse file into individual entries, to later inspect for   215.    # non-convertable data.   216.    entry = None  217.    while True:  218.      entry = self.parse_entry(input, verbosity)  219.      if entry is None:  220.        break  221.      self.entries.append(entry)  222.  223.    input.close()  224.  225.  def assert_valid_format(self, format_nbr, verbosity=0):  226.    if verbosity >= 2:  227.      print("Validating format for entries file '%s'" % self.path)  228.    for entry in self.entries:  229.      if verbosity >= 3:  230.        print("Validating format for entry '%s'" % entry.get_name())  231.      try:  232.        entry.assert_valid_format(format_nbr)  233.      except LossyConversionException:  234.        if verbosity >= 3:  235.          sys.stderr.write("Offending entry:/n%s/n" % entry)  236.          sys.stderr.flush()  237.        raise  238.  239.  def parse_entry(self, input, verbosity=0):  240.    "Read an individual entry from INPUT stream."  241.    entry = None  242.  243.    while True:  244.      line = input.readline()  245.      if line in ("", "/x0c/n"):  246.        # EOF or end of entry terminator encountered.   247.        break  248.  249.      if entry is None:  250.        entry = Entry()  251.  252.      # Retain the field value, ditching its field terminator ("/x0a").   253.      entry.fields.append(line[:-1])  254.  255.    if entry is not None and verbosity >= 3:  256.      sys.stdout.write(str(entry))  257.      print("-" * 76)  258.    return entry  259.  260.  def write_format(self, format_nbr):  261.    # Overwrite all bytes of the format number (which are the first bytes in   262.    # the file).  Overwrite format '10' by format '09', which will be converted   263.    # to '9' by Subversion when it rewrites the file.  (Subversion 1.4 and later   264.    # ignore leading zeroes in the format number.)   265.    assert len(str(format_nbr)) <= self.format_nbr_bytes  266.    format_string = '%0' + str(self.format_nbr_bytes) + 'd'  267.  268.    os.chmod(self.path, 0600)  269.    output = open(self.path, "r+", 0)  270.    output.write(format_string % format_nbr)  271.    output.close()  272.    os.chmod(self.path, 0400)  273.  274.class Entry:  275.  "Describes an entry in a WC."  276.  277.  # Maps format numbers to indices of fields within an entry's record that must   278.  # be retained when downgrading to that format.   279.  must_retain_fields = {  280.      # Not in 1.4: changelist, keep-local, depth, tree-conflicts, file-externals   281.      8  : (30, 31, 33, 34, 35),  282.      # Not in 1.5: tree-conflicts, file-externals   283.      9  : (34, 35),  284.      10 : (),  285.      # Downgrading from format 11 (1.7-dev) to format 10 is not possible,   286.      # because 11 does not use has-props and cachable-props (but 10 does).   287.      # Naively downgrading in that situation causes properties to disappear   288.      # from the wc.   289.      #   290.      # Downgrading from the 1.7 SQLite-based format to format 10 is not   291.      # implemented.   292.      }  293.  294.  def __init__(self):  295.    self.fields = []  296.  297.  def assert_valid_format(self, format_nbr):  298.    "Assure that conversion will be non-lossy by examining fields."  299.  300.    # Check whether lossy conversion is being attempted.   301.    lossy_fields = []  302.    for field_index in self.must_retain_fields[format_nbr]:  303.      if len(self.fields) - 1 >= field_index and self.fields[field_index]:  304.        lossy_fields.append(Entries.entry_fields[field_index])  305.    if lossy_fields:  306.      raise LossyConversionException(lossy_fields,  307.        "Lossy WC format conversion requested for entry '%s'/n"  308.        "Data for the following field(s) is unsupported by older versions "  309.        "of/nSubversion, and is likely to be subsequently discarded, and/or "  310.        "have/nunexpected side-effects: %s/n/n"  311.        "WC format conversion was cancelled, use the --force option to "  312.        "override/nthe default behavior."  313.        % (self.get_name(), ", ".join(lossy_fields)))  314.  315.  def get_name(self):  316.    "Return the name of this entry."  317.    return len(self.fields) > 0 and self.fields[0] or ""  318.  319.  def __str__(self):  320.    "Return all fields from this entry as a multi-line string."  321.    rep = ""  322.    for i in range(0, len(self.fields)):  323.      rep += "[%s] %s/n" % (Entries.entry_fields[i], self.fields[i])  324.    return rep  325.  326.class Format:  327.  """Represents a .svn/format file."""  328.  329.  def __init__(self, path):  330.    self.path = path  331.  332.  def write_format(self, format_nbr, verbosity=0):  333.    format_string = '%d/n'  334.    if os.path.exists(self.path):  335.      if verbosity >= 1:  336.        print("%s will be updated." % self.path)  337.      os.chmod(self.path,0600)  338.    else:  339.      if verbosity >= 1:  340.        print("%s does not exist, creating it." % self.path)  341.    format = open(self.path, "w")  342.    format.write(format_string % format_nbr)  343.    format.close()  344.    os.chmod(self.path, 0400)  345.  346.class LocalException(Exception):  347.  """Root of local exception class hierarchy."""  348.  pass  349.  350.class LossyConversionException(LocalException):  351.  "Exception thrown when a lossy WC format conversion is requested."  352.  def __init__(self, lossy_fields, str):  353.    self.lossy_fields = lossy_fields  354.    self.str = str  355.  def __str__(self):  356.    return self.str  357.  358.class UnrecognizedWCFormatException(LocalException):  359.  def __init__(self, format, path):  360.    self.format = format  361.    self.path = path  362.  def __str__(self):  363.    return ("Unrecognized WC format %d in '%s'; "  364.            "only formats 8, 9, and 10 can be supported") % (self.format, self.path)  365.  366.  367.def main():  368.  try:  369.    opts, args = my_getopt(sys.argv[1:], "vh?",  370.                           ["debug", "force", "skip-unknown-format",  371.                            "verbose", "help"])  372.  except:  373.    usage_and_exit("Unable to process arguments/options")  374.  375.  converter = WCFormatConverter()  376.  377.  # Process arguments.   378.  if len(args) == 2:  379.    converter.root_path = args[0]  380.    svn_version = args[1]  381.  else:  382.    usage_and_exit()  383.  384.  # Process options.   385.  debug = False  386.  for opt, value in opts:  387.    if opt in ("--help", "-h", "-?"):  388.      usage_and_exit()  389.    elif opt == "--force":  390.      converter.force = True  391.    elif opt == "--skip-unknown-format":  392.      converter.error_on_unrecognized = False  393.    elif opt in ("--verbose", "-v"):  394.      converter.verbosity += 1  395.    elif opt == "--debug":  396.      debug = True  397.    else:  398.      usage_and_exit("Unknown option '%s'" % opt)  399.  400.  try:  401.    new_format_nbr = LATEST_FORMATS[svn_version]  402.  except KeyError:  403.    usage_and_exit("Unsupported version number '%s'; "  404.                   "only 1.4, 1.5, and 1.6 can be supported" % svn_version)  405.  406.  try:  407.    converter.change_wc_format(new_format_nbr)  408.  except LocalException, e:  409.    if debug:  410.      raise  411.    sys.stderr.write("%s/n" % e)  412.    sys.stderr.flush()  413.    sys.exit(1)  414.  415.  print("Converted WC at '%s' into format %d for Subversion %s" % /  416.        (converter.root_path, new_format_nbr, svn_version))  417.  418.if __name__ == "__main__":  419.  main()  


原创粉丝点击