使用ruby-git切换Git分支成功后工作区文件未更新该如何解决?
问题根因
你遇到的现象是ruby-git库的分支创建逻辑和原生git命令不一致导致的:
- 原生git执行
git checkout test时如果本地无test分支、远程存在同名分支,会自动创建关联远程分支的本地分支并拉取对应文件 - ruby-git库调用
g.branch("test").checkout时,如果本地不存在test分支,会基于当前默认分支的提交创建一个全新的本地独立test分支,不会自动关联远程分支,因此分支名显示为test,但文件内容和默认分支完全一致 - 额外排查点:请确认你的
full_dir变量值为克隆生成的仓库完整路径,即File.join(root_dir, root_folder),路径错误也会读取到非目标仓库的文件
修复方案
调整分支切换逻辑,先拉取所有远程分支更新,主动关联远程test分支:
root_dir = Dir.mktmpdir(nil, Rails.root.join("repos").to_s) root_folder = "ruby_git" Git.clone("https://github.com/ruby-git/ruby-git.git", root_folder, :path => root_dir) # 确保路径正确 full_dir = File.join(root_dir, root_folder) g = Git.open(full_dir) if g.current_branch != "test" # 先拉取所有远程分支的最新数据 g.fetch # 判断本地是否已有test分支,不存在则基于远程origin/test创建跟踪分支 if !g.branches.local.map(&:name).include?("test") g.branch('test').checkout_tracking('origin/test') else g.branch('test').checkout # 拉取test分支最新提交,避免本地分支版本落后 g.pull end end
校验方法
执行后可以通过以下代码确认分支关联和文件内容:
# 确认当前分支 puts g.current_branch # 确认当前分支最新提交哈希和远程test分支一致 puts g.branch("test").gcommit.sha # 确认文件内容 puts Dir["#{full_dir}/tests/*"]
内容的提问来源于stack exchange,提问作者Cjoerg
相关产品推荐
相关产品推荐

