Rust版本控制库git_rev的使用,git_rev提供Git提交哈希、版本信息与仓库状态的高效查询功能

Rust版本控制库git_rev的使用

git_rev是一个Rust库,提供Git提交哈希、版本信息与仓库状态的高效查询功能。

安装

在项目目录中运行以下Cargo命令:

cargo add git_rev

或在Cargo.toml中添加:

git_rev = "0.1.0"

使用示例

以下是git_rev库的基本使用示例:

use git_rev::{Rev, Error};

fn main() -> Result<(), Error> {
    // 获取当前Git仓库的提交哈希
    let rev = Rev::new()?;
    
    // 获取完整的提交哈希
    println!("Commit hash: {}", rev.hash());
    
    // 获取短哈希(前7个字符)
    println!("Short hash: {}", rev.short_hash());
    
    // 检查仓库是否有未提交的更改
    println!("Repository dirty: {}", rev.is_dirty());
    
    Ok(())
}

完整示例代码

use git_rev::{Rev, Error};

fn main() -> Result<(), Error> {
    // 初始化Rev对象
    let rev = match Rev::new() {
        Ok(r) => r,
        Err(e) => {
            eprintln!("Failed to get git revision: {}", e);
            return Err(e);
        }
    };

    // 打印版本信息
    println!("Version Information:");
    println!("---------------------");
    println!("Full Commit Hash: {}", rev.hash());
    println!("Short Commit Hash: {}", rev.short_hash());
    println!("Tag (if any): {:?}", rev.tag());
    println!("Branch: {:?}", rev.branch());
    println!("Repository is dirty: {}", rev.is_dirty());
    println!("Build timestamp: {:?}", rev.timestamp());

    // 检查是否在特定提交上构建
    if let Some(tag) = rev.tag() {
        println!("This build is based on tag: {}", tag);
    } else {
        println!("This build is not based on any tag");
    }

    Ok(())
}

功能说明

git_rev库提供以下功能:

  • 获取完整的Git提交哈希
  • 获取短哈希(前7个字符)
  • 检查当前分支
  • 检查当前标签
  • 检测仓库是否有未提交的更改
  • 获取构建时间戳

许可证

该库使用0BSD许可证。


1 回复

Rust版本控制库git_rev使用指南

git_rev是一个轻量级的Rust库,用于查询Git仓库的提交哈希、版本信息和仓库状态。它特别适合需要在构建时或运行时获取Git版本信息的应用程序。

主要功能

  • 获取当前Git提交的完整哈希
  • 获取短哈希(默认前7个字符)
  • 检测仓库是否有未提交的修改
  • 获取分支名称
  • 获取标签信息(如果当前提交被打过标签)

安装

Cargo.toml中添加依赖:

[dependencies]
git_rev = "0.2"

基本使用方法

获取Git提交哈希

use git_rev::CommitHash;

fn main() {
    match CommitHash::new() {
        Ok(hash) => {
            println!("Full hash: {}", hash.full());
            println!("Short hash: {}", hash.short());
        }
        Err(e) => eprintln!("Error getting commit hash: {}", e),
    }
}

检查仓库状态

use git_rev::RepoStatus;

fn main() {
    match RepoStatus::new() {
        Ok(status) => {
            if status.is_dirty() {
                println!("Repository has uncommitted changes");
            } else {
                println!("Repository is clean");
            }
        }
        Err(e) => eprintln!("Error checking repo status: {}", e),
    }
}

获取分支信息

use git_rev::Branch;

fn main() {
    match Branch::current() {
        Ok(branch) => {
            println!("Current branch: {}", branch.name());
        }
        Err(e) => eprintln!("Error getting branch: {}", e),
    }
}

高级用法

在构建时获取Git信息

你可以在build.rs中使用git_rev来生成编译时的版本信息:

// build.rs
use git_rev::{CommitHash, RepoStatus};

fn main() {
    let hash = CommitHash::new().unwrap();
    let status = RepoStatus::new().unwrap();
    
    println!("cargo:rustc-env=GIT_HASH={}", hash.short());
    println!("cargo:rustc-env=GIT_DIRTY={}", status.is_dirty());
}

然后在主程序中使用这些信息:

fn main() {
    println!(
        "Version: {} ({}{})",
        env!("CARGO_PKG_VERSION"),
        env!("GIT_HASH"),
        if env!("GIT_DIRTY") == "true" { "-dirty" } else { "" }
    );
}

组合使用多个功能

use git_rev::{CommitHash, RepoStatus, Branch};

fn get_version_info() -> String {
    let hash = CommitHash::new().unwrap_or_default();
    let status = RepoStatus::new().unwrap_or_default();
    let branch = Branch::current().unwrap_or_default();
    
    format!(
        "{}@{}{} [{}]",
        branch.name(),
        hash.short(),
        if status.is_dirty() { "*" } else { "" },
        env!("CARGO_PKG_VERSION")
    )
}

fn main() {
    println!("Application version: {}", get_version_info());
}

完整示例代码

// 完整版本信息收集示例

use git_rev::{CommitHash, RepoStatus, Branch};
use std::env;

fn main() {
    // 获取Git仓库信息
    let git_info = match get_git_info() {
        Ok(info) => info,
        Err(e) => {
            eprintln!("无法获取Git信息: {}", e);
            return;
        }
    };

    // 显示完整版本信息
    println!("应用版本信息:");
    println!("-------------------------------");
    println!("版本号: {}", env!("CARGO_PKG_VERSION"));
    println!("Git分支: {}", git_info.branch);
    println!("提交哈希: {}", git_info.commit_hash);
    println!("仓库状态: {}", if git_info.is_dirty { "有未提交修改" } else { "干净" });
    println!("标签: {}", git_info.tag.unwrap_or_else(|| "无".to_string()));
    println!("-------------------------------");
}

struct GitInfo {
    branch: String,
    commit_hash: String,
    is_dirty: bool,
    tag: Option<String>,
}

fn get_git_info() -> Result<GitInfo, Box<dyn std::error::Error>> {
    // 获取分支信息
    let branch = Branch::current()?.name().to_string();
    
    // 获取提交哈希
    let commit = CommitHash::new()?;
    let commit_hash = commit.short().to_string();
    
    // 检查仓库状态
    let status = RepoStatus::new()?;
    let is_dirty = status.is_dirty();
    
    // 获取标签信息(这里简化为None,实际可以使用git2等库获取)
    let tag = None;
    
    Ok(GitInfo {
        branch,
        commit_hash,
        is_dirty,
        tag,
    })
}

注意事项

  1. git_rev需要在Git仓库目录中工作,如果在非Git目录调用会返回错误
  2. 对于大型仓库,首次查询可能会有轻微延迟
  3. 如果需要在构建时使用,请确保构建环境可以访问Git仓库

git_rev是一个简单但功能强大的工具,特别适合需要将Git版本信息集成到应用程序中的场景,如生成版本字符串、构建信息报告等。

回到顶部