如何遍历Git仓库?

13

我正在尝试理解一个项目,使用gitk查看它的演变有所帮助。我的做法是检出第一个提交,了解代码,运行测试,然后进入下一个提交并重复此过程。我的当前工作流程是通过哈希值检出提交。

git checkout 79cd6

但我希望有另一个分支,可以让我进行自己的更改,并允许我合并主分支的提交,但无需查找提交哈希值。理想化的工作流程:

git checkout -b <newbranch> <first commit id of master>
git <command to move head of current branch to next commit of master>
4个回答

14

我知道这是一个有点老的问题,但我想做同样的事情并找到了答案,所以我想分享一下。

for commit in $(git rev-list master --reverse)
do
    git checkout $commit
    read
done

在同一个窗口中完成此操作。它将从您的初始提交开始,并且每次按下 Enter 键后都会继续进行。然后,在不同的 shell 中执行测试等操作。
如果是线性历史,则运行得非常完美,但我不太确定它如何处理合并等操作。我相信它会合理处理,但可能因情况而异。


2
运行得非常好!如果您不想检出整个历史记录,也可以使用 git rev-list master ^[hash of first commit to checkout]^ --reverse - CletusW
我还要补充一点,即在末尾添加git checkout master,这样你就能回到正确的分支上。 - CletusW
1
这是我的bash文件的结果:https://gist.github.com/cletusw/a2381514ecbd0c2c48dc - CletusW

3

将此保存为〜/bin/git-next或其他路径下的文件:

#!/bin/bash
git co $(git rev-list --children --all | awk "/^$(git rev-parse @\{0})/ { print \$2; }")

这将检查当前版本的第一个子节点。

在大型存储库上,这将非常缓慢,但它会完成工作。

您可以根据需要修改此内容以处理您的分支。


如果速度是一个问题,你可以存储 git rev-list <branch> 的输出,然后找到包含当前 HEAD 的行,并检出它的前一行。 - Cascabel
谢谢!我将其设置为别名,语法略有不同:alias gitnext='git checkout $(git rev-list --children --all | grep "$(git rev-parse @{0}) " | awk "{print \$2}")' - Nathan Garabedian

0

我想要一种简单的方式来浏览分支中的提交,以进行代码审查/演示。这是我写的小脚本,用于自动化它。将以下内容放入文件中,比如说git_step,然后像这样运行它:git_step d17dacce8b13b2ad454003da7cbd670a06c41437

#!/bin/bash

BASE_REV=${BASE_REV:-$1};
current_branch=$(git branch | grep '^*' | awk '{print $2}');

for rev in $(git rev-list ${BASE_REV}..HEAD | tail -r); do
    git checkout $rev;
    LESS='RSX' git show -p $rev;
done;

git checkout ${current_branch};

这篇文章也可以在这里找到。


0
你可以写一个小的 shell 脚本。第一个脚本将运行:git log --pretty=oneline | awk '{print $1;}'。第二个脚本(称其为step或其他名称)将使用headtailwc -l。然后使用tail读取文件的最后一行,找出文件中有多少行,并从文件中删除最后一行。这样做不够优雅,但它会达到效果。:) (如果您想更简洁一些,它可以使用truncate(1)仅剪切掉文件的最后一行,而不是总是创建新的临时文件。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接