使用Git cherry-pick命令挑选包含关键词(跟踪ID)的提交记录。

4

为了进行代码审查,我想要:

  1. 挑选特定的提交
  2. 创建一个包含它们的新分支,并将其
  3. 推送到远程仓库

这样,我就可以把分支链接给同事进行审查。

我想要创建一个shell脚本,只需输入简单命令即可。

git-review <trackingID>

它的输出如下所示。
Branch <currentgitusername>_<trackingID> created and pushed to remote.

我编写了一个脚本,执行上述步骤。
#!/bin/bash

if [ -z $1 ]; then
    echo "Rationale: Cherry pick all commits in master, matching the tracking ID and create a new branch.";
    echo "";
    echo "Usage:  $0 traackingID";
    echo "";
    exit 1;
fi

#If $1 doesn't match a AGW-<number> pattern, thrown an error
#Best of luck if you did not add add tracking ID in commits.

user="$(id -u -n)" > /dev/null

echo "You are - $user"

branchname=$user"_"$1"_review"

echo "Creating branch - $branchname"

git checkout -b $branchname > /dev/null

git log master --pretty=%H --grep="$1" | while read rev
do
  echo $rev
 # git cherry-pick $rev > /dev/null
done

#git push &> /dev/null

echo "Created branch, cherry picked, pushed to remote. Now switching back to master. Bye."

git checkout master

但在几个地方卡住了。

  1. I want to validate the trackingID format. It should be AGW-<somenumber>
  2. Looks like the cherry-picks have merge issues.

    myname@mymachine ~/myproj
    $ ../git-review.sh AGW-1234
    You are - myname
    Creating branch - myname_AGW-1234_review
    Switched to a new branch 'myname_AGW-1234_review'
    2dfafa89e10062e7cfccb1d7a947ebb848c40cc6
    The previous cherry-pick is now empty, possibly due to conflict resolution.
    If you wish to commit it anyway, use:
    
        git commit --allow-empty
    
    Otherwise, please use 'git reset'
    1e295000bc3d80880518c9cac5e34ef3b28fc29e
    error: Your local changes to the following files would be overwritten by merge:
            rest-service/src/main/java/package/HealthCheckDAOImpl.java
    Please, commit your changes or stash them before you can merge.
    
我是否在错误地挑选数据?请建议任何改变以使此脚本更加健壮。

2
看起来你可能在反向挑选提交,与最初的提交顺序相反。请记住,git log 将最新的提交放在输出的顶部。此外,有一个名为 git review 的工具可用于与 Gerrit 交互,因此您可能需要选择不同的名称以避免混淆。 - Phil Miller
个人建议您使用git rev-list而不是git log --pretty=%H。它接受与git log相同的选项,但直接打印提交的SHA1。 - Sascha Wolf
@Novelocrat 看起来问题不仅在于选择错误的顺序。我做了一些更改,将它们推送到主分支。现在我正在从主分支创建一个新分支,并尝试应用一些已经存在的代码更改提交!如何解决这个问题?对我来说,这个分支的唯一目的是进行审查。我们团队目前没有遵循分支管理,每个人都直接推送到主分支。我未能说服他们使用分支管理。 - TechCrunch
@TechCrunch 你没能说服他们使用分支吗?那为什么还要使用Git呢?这就像买了一个无线电动螺丝刀,然后继续用肌肉力量拧螺丝一样。 - Sascha Wolf
1个回答

1

正如@novelocrat在评论中指出的那样,您的选择顺序有误。默认情况下,git log将从最新提交到第一个提交输出。要做到这一点,请将git log --oneline的输出提供给tac,或使用--reverse标志:

git log --oneline | tac
git log --oneline --reverse

第二个选项显然更好,因为它可以确保逐行输出,而第一个选项(使用tac)需要一次性输入所有内容。
此外,由于您正在从主分支创建一个新分支,当您执行git checkout -b $branchname时,当前分支的所有历史记录都将被复制。
因此,您需要创建一个孤立的git分支,就像这里提到的那样

看起来问题不仅在于选择错误的顺序。我做了一些更改,将它们推送到主分支。现在我正在从主分支创建一个新分支,并尝试应用一些已经存在的代码更改提交!如何解决这个问题?对我来说,这个分支的唯一目的是进行审查。我们团队目前没有遵循分支管理,每个人都直接推送到主分支。我未能说服他们使用分支管理。 - TechCrunch
为了给孤儿提供起点,我正在尝试找到我的第一个提交之前的提交。git rev-list master --reverse --grep="AGW-1234" 给出了我的提交。我需要选择此输出的第一行并在其末尾添加~1作为起点。卡在如何在shell脚本中获取此命令输出的第一行。有建议吗? - TechCrunch
孤立分支将拥有所有的代码,但是不会附带修订历史记录。因此,它将与我的主分支相同,我不能再次对其进行相同的更改。 - TechCrunch
@TechCrunch 不。孤立分支将是一个完全没有共同历史的全新分支。重新阅读评论,我看到您正在尝试将与票证相关的问题合并到一个基于现有历史的单个新分支中。在这种情况下,请修改您的脚本以 git checkout -b $branchname <SHA_of_fisrt_commit>~1。我建议您改变工作流程,每个分支只处理一个票证;如果您有大量跨越较长时间的错误,则尝试在同一分支上处理多个票证根本行不通。 - Anshul Goyal
@TechCrunch 最后一点,我认为你的原始问题现在已经发生了显著变化,你应该将其标记为已回答,并提出一个新问题,说明你确切的问题。 - Anshul Goyal
显示剩余5条评论

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