2010-07-21 58 views
7

我想了解一个项目,它有助于通过使用gitk来查看它的演变。我所做的是签出第一次提交,理解代码,运行测试,转到下一次提交并重复。我现在的工作流程是检出通过哈希提交如何通过git存储库?

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> 

回答

1

您可以编写一个小小的shell脚本。一个脚本将运行git log --pretty=oneline | awk '{print $1;}'。第二个脚本(称为step或其他)将使用head,tail,wc -l。然后用tail读取文件的最后一行,找出文件中有多少行,并从文件中删除最后一行。很难看,但它会完成这项工作。 :)(如果你想少一点丑陋,它可以使用truncate(1)只砍掉文件的最后一行,而不是总是使新的临时文件。)

2

保存此作为~/bin/git-next或在别的地方你路径:

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

这将检查当前修订的第一个孩子。

这将是非常缓慢的大回购,但它会做的工作。

您可以根据需要对其进行修改以处理分支。

+0

如果速度有问题,可以存储'git rev-list '的输出,只需找到当前HEAD所在的行,然后查看该行。 – Cascabel 2010-07-21 18:43:04

7

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

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

在一个窗口中做到这一点。它将从您的初始提交开始,并在您每次输入时提前一次。然后在不同的shell中进行测试等。
它会完美的线性历史,但我不太确定它将如何处理合并等。我相信这是合理的,但你的里程可能会有所不同。

+1

像魅力一样工作!如果你不想签出整个历史记录,你也可以使用'git rev-list master^[第一次提交结账的散列]^--reverse'。 – CletusW 2014-07-10 17:14:16

+0

我也会把'git checkout master'加到最后,所以你最终回到了正确的分支。 – CletusW 2014-07-10 17:18:44

+0

这里是我生成的bash文件:https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW 2014-07-10 18:58:32

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}; 

也可作为gist here