【问题标题】:Find a common commit in two completely different git trees在两个完全不同的 git 树中找到一个共同的提交
【发布时间】:2013-02-22 22:34:09
【问题描述】:

以下脚本尝试查找两个分支的最新共同提交。提交应具有相同的主题、相同的作者和相同的作者日期。但是 commit datehash 是不同的。因此,git rebase 无法自动找到该分支。

#!/bin/bash
lastbr=
lastrest=
revU=  # Update
revB=  # Base
rm -f rev.*.tmp
(
  git log --format='format:b %H %at %an %ae %f' master
  echo
  git log --format='format:u %H %at %an %ae %f' master_tmpnew
) | sort -r -t' ' -k3 | while read br rev rest; do
  echo "? $br $rev $rest"
  [ "$br" != "u" ] || revU="$rev"
  [ "$br" != "b" ] || revB="$rev"
  if [ "$lastrest" = "$rest" -a "$lastbr" != "$br" ]; then
    echo "found match: base $revB  updae $revU"
    echo "$revB" >rev.base.tmp
    echo "$revU" >rev.update.tmp
    break
  fi
  lastrest="$rest"
  lastbr="$br"
done
if [ ! -f rev.base.tmp ]; then
  echo "No matching revision found"
  exit 1
fi
revB="`cat rev.base.tmp`"
revU="`cat rev.update.tmp`"
git rebase --onto $revB $revU master_tmpnew

问题:我觉得这个解决方案不太好。你们中是否有人对如何解决这个问题有更好的想法,或者是否已经有可用的解决方案?

背景:我尝试使用工具cvs2git 实现增量CVS-to-GIT 导入。官方不支持增量导入,但是我找到了类似this workaround的解决方案。唯一的问题:我在做一个简单的git rebase 时遇到了问题。因为分支不匹配(由于 git2svn 的性质而导致不同的哈希和提交日期),如果我在没有详细参考的情况下使用它(常见提交),它通常会重写比必要更多的提交。检查this 以获得上述脚本的可运行测试场景。

【问题讨论】:

  • 我应该使用master 代替$revB 作为rebase 命令:git rebase --onto master $revU master_tmpnew。但这不是我的问题。

标签: git bash git-rebase cvs2git


【解决方案1】:

也许 git-cherry 可以使用。它将比较更改集而不是提交哈希来确定两个提交是否包含相同的内容。

http://www.kernel.org/pub//software/scm/git/docs/git-cherry.html

【讨论】:

  • 感谢您将我推向正确的轨道。在手册中,我发现命令 git-cherry、git-patch-id 和 git-cherry-pick now,它们都非常有趣。最后,我可以用这个命令行替换上面的代码:git cherry-pick $( git cherry master master_tmpnew | grep '^+' | cut -d' ' -f2)
  • 酷。很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2020-04-03
  • 2016-09-26
  • 1970-01-01
  • 2023-03-23
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多