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,
})
}
注意事项
git_rev
需要在Git仓库目录中工作,如果在非Git目录调用会返回错误- 对于大型仓库,首次查询可能会有轻微延迟
- 如果需要在构建时使用,请确保构建环境可以访问Git仓库
git_rev
是一个简单但功能强大的工具,特别适合需要将Git版本信息集成到应用程序中的场景,如生成版本字符串、构建信息报告等。