【问题标题】:Git cherry pick those commits that contain a keyword (tracking id)Git cherry 挑选那些包含关键字的提交(跟踪 id)
【发布时间】:2015-02-26 06:33:23
【问题描述】:

出于代码审查目的,我想

  1. cherry pick 特定的提交
  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. 我想验证 trackingID 格式。应该是AGW-&lt;somenumber&gt;
  2. 看起来樱桃精选有合并问题。

    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.
    

我采摘樱桃的方式有误吗?另外,请提出任何更改以使此脚本更健壮。

【问题讨论】:

  • 看起来您可能会按照与最初提交的顺序相反的顺序进行挑选。请记住,git log 将最新的提交放在其输出的顶部。此外,还有一个名为 git review 的工具用于与 Gerrit 交互,因此您可能需要选择其他名称以避免混淆。
  • 我个人建议您使用git rev-list 而不是git log --pretty=%H。它接受与 git log 相同的选项,但直接打印提交的 SHA1。
  • @Novelocrat 看起来问题不仅在于选择错误的顺序。我做了一些改变。我将我的更改推送给大师。现在我正在从 master 创建一个分支,并尝试应用一些具有代码更改的提交!如何解决这个问题?对我来说,这个分​​支的唯一目的是审查。我们目前没有在我们的团队中关注分支,每个人都直接推送到 master。我未能说服他们使用分支。
  • @TechCrunch 你没能说服他们使用分支?那为什么还要费心使用git呢?这就像买了一把无绳螺丝刀,然后继续用肌肉力量拧螺丝。

标签: git shell


【解决方案1】:

正如@novelocrat 在 cmets 中已经指出的那样,您采摘樱桃的顺序错误。默认情况下,git log 会从最近一次提交输出到第一次提交。为此,请将git log --oneline 的输出输入到tac,或使用--reverse 标志:

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

显然首选第二个选项,因为这样可以确保逐行输出,而第一个(使用tac)需要一次性输入所有输入。


另外,由于您是在 master 之外创建一个新分支,所以当您执行 git checkout -b $branchname 时。

当你这样做时,当前分支的所有历史都会从中挑选出来。

所以你需要创建一个孤立的 git 分支,like mentioned here

【讨论】:

  • 看起来问题不仅在于拣货顺序错误。我做了一些改变。我将我的更改推送给大师。现在,我正在从 master 创建一个分支,并尝试应用一些具有代码更改的提交!如何解决这个问题?对我来说,这个分​​支的唯一目的是审查。我们目前没有在我们的团队中关注分支,每个人都直接推送到 master。我未能说服他们使用分支。
  • @TechCrunch 哦,对不起,应该已经看到了。基本上使用一个孤立的分支,就像这里提到的 -> stackoverflow.com/a/4288660/1860929
  • 为了给孤儿一个起点,我试图找到我第一次提交之前的提交。 git rev-list master --reverse --grep="AGW-1234" 给出了我的提交。我需要选择此输出的第一行并将 ~1 附加到它作为起点。坚持如何在 shell 脚本中获取此命令输出的第一行。建议?
  • @TechCrunch 将~1 附加到它作为起点是什么意思..?
  • 2dfafa89.这是作为错误修复的一部分的第一次提交。如果我使用 2dfafa89~1,那么它将从 2dfafa89 的父级创建一个分支。然后我会挑选我的错误修复提交到这个分支。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 2019-04-04
  • 2017-12-11
  • 2016-04-11
  • 2014-11-21
  • 2017-12-30
相关资源
最近更新 更多