Git 挑选那些包含关键字(跟踪 ID)的提交
Git cherry pick those commits that contain a keyword (tracking id)
出于代码审查的目的,我想
- cherry pick 特定提交
- 与他们一起创建一个新分支
- 将该分支推送到远程
以便我可以将分支 url 交给同行审阅。
我想创建一个 shell 脚本并发出像
这样的简单命令
git-review <trackingID>
输出如下
Branch <currentgitusername>_<trackingID> created and pushed to remote.
我整理了一个执行上述步骤的脚本。
#!/bin/bash
if [ -z ]; then
echo "Rationale: Cherry pick all commits in master, matching the tracking ID and create a new branch.";
echo "";
echo "Usage: [=13=] traackingID";
echo "";
exit 1;
fi
#If 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"_""_review"
echo "Creating branch - $branchname"
git checkout -b $branchname > /dev/null
git log master --pretty=%H --grep="" | 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
但是卡在了几个地方。
- 我想验证 trackingID 格式。应该是
AGW-<somenumber>
看起来 cherry-picks 有合并问题。
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.
我是不是采摘樱桃的方式不对?另外,请提出任何更改建议以使此脚本更健壮。
正如@novelocrat 在评论中指出的那样,您采摘的顺序错误。默认情况下,git 日志将从最新的提交输出到第一次提交。为此,要么将 git log --oneline
的输出输入到 tac
,要么使用 --reverse
标志:
git log --oneline | tac
git log --oneline --reverse
第二个选项显然是首选,因为它确保逐行输出,而第一个(使用 tac
)需要一次性输入所有内容。
此外,由于您是在 master 之外创建一个新分支,因此当您执行 git checkout -b $branchname
.
当您这样做时,当前分支的所有历史记录都会从中选取。
因此您需要创建一个孤立的 git 分支,like mentioned here。
出于代码审查的目的,我想
- cherry pick 特定提交
- 与他们一起创建一个新分支
- 将该分支推送到远程
以便我可以将分支 url 交给同行审阅。
我想创建一个 shell 脚本并发出像
这样的简单命令git-review <trackingID>
输出如下
Branch <currentgitusername>_<trackingID> created and pushed to remote.
我整理了一个执行上述步骤的脚本。
#!/bin/bash
if [ -z ]; then
echo "Rationale: Cherry pick all commits in master, matching the tracking ID and create a new branch.";
echo "";
echo "Usage: [=13=] traackingID";
echo "";
exit 1;
fi
#If 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"_""_review"
echo "Creating branch - $branchname"
git checkout -b $branchname > /dev/null
git log master --pretty=%H --grep="" | 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
但是卡在了几个地方。
- 我想验证 trackingID 格式。应该是
AGW-<somenumber>
看起来 cherry-picks 有合并问题。
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.
我是不是采摘樱桃的方式不对?另外,请提出任何更改建议以使此脚本更健壮。
正如@novelocrat 在评论中指出的那样,您采摘的顺序错误。默认情况下,git 日志将从最新的提交输出到第一次提交。为此,要么将 git log --oneline
的输出输入到 tac
,要么使用 --reverse
标志:
git log --oneline | tac
git log --oneline --reverse
第二个选项显然是首选,因为它确保逐行输出,而第一个(使用 tac
)需要一次性输入所有内容。
此外,由于您是在 master 之外创建一个新分支,因此当您执行 git checkout -b $branchname
.
当您这样做时,当前分支的所有历史记录都会从中选取。
因此您需要创建一个孤立的 git 分支,like mentioned here。