如何在git中模拟svnversion命令?

时间:2012-08-24 01:56:25

标签: git svn

来自svnversion文档:

[adrdec@opsynxvm0081 common_cpp]$ svnversion --help
usage: svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]
     

为工作副本路径生成紧凑的“版本号”   WC_PATH。例如:

$ svnversion . /repos/svn/trunk
4168
     

如果工作副本是,则版本号将是单个数字   单个修订,未修改,未切换且具有URL   匹配TRAIL_URL参数。如果工作副本不正常了   版本号将更复杂:

   4123:4168     mixed revision working copy
   4168M         modified working copy
   4123S         switched working copy
   4123P         partial working copy, from a sparse checkout
   4123:4168MS   mixed revision, modified, switched working copy

2 个答案:

答案 0 :(得分:3)

此解决方案检测工作目录中的更改,如svnversion所做的。

    def get_version(self, path):
            curdir = self.get_cur_dir()
            os.chdir(path)
            version = self.execute_command("git log --pretty=format:%H -n1")[self.OUT].strip()  #get the last revision and it's comment
            status = self.execute_command("git status")[self.OUT].strip()  #get the status of the working copy
            if "modified" in status or "added" in status or "deleted" in status:
                    version += self.modified
            os.chdir(curdir)
            return version


    def execute_command(self, cmd_list):
            proc = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, shell=True)
            (out, err) = proc.communicate()
            rc = proc.returncode
            return rc, out, err   

答案 1 :(得分:1)

我对SVN并不熟悉,但据我所知,SVN以简单数字的形式识别修订版:1,2,3 ... Git并没有很好地翻译,因为它使用SSH哈希来识别修订版(在Git世界中称为'提交')。但是,使用git log来获取此信息仍然非常简单:

git log --pretty="format:%h" -n1 HEAD

这将在repo中打印当前已检出的提交(这是HEAD的内容)。或者,您可以使用HEAD(或任何其他分支)替换命令中的master以获取该分支的最后一次提交,而不是代表您的工作目录的那个。此外,如果您需要完整的SHA1,请将上面的%h替换为%H。您还可以阅读git-log联机帮助页,了解有关--pretty格式的更多信息。

此外,您可以在.gitconfig中添加别名,以便在任何地方执行此操作。将以下行添加到~/.gitconfig(如果您的[alias]已有该部分,请不要.gitconfig):

[alias]
    rev = "git log --pretty='format:%h'"

现在,只要您在Git仓库中,并希望查看当前版本,只需输入git rev