Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git:检查筛选器分支是否会触及已推送的提交_Git_Push_Git Filter Branch - Fatal编程技术网

git:检查筛选器分支是否会触及已推送的提交

git:检查筛选器分支是否会触及已推送的提交,git,push,git-filter-branch,Git,Push,Git Filter Branch,基本上,我想得到一个警告,如果一个过滤器分支将更改一个已经被推送的提交 假设我想做一个实验 git filter-branch ... --ancestry-path A^..HEAD 当然,我可以创建一个受影响哈希的列表,并用一个已经推送的所有哈希的列表来“comm”进行比较。有没有更直接的解决方案 编辑:我对可编写脚本的解决方案感兴趣。假设您领先于master(或您正在处理的任何分支),并运行git status,您将看到如下内容: Your branch is ahead of 'ori

基本上,我想得到一个警告,如果一个过滤器分支将更改一个已经被推送的提交

假设我想做一个实验

git filter-branch ... --ancestry-path A^..HEAD
当然,我可以创建一个受影响哈希的列表,并用一个已经推送的所有哈希的列表来“comm”进行比较。有没有更直接的解决方案


编辑:我对可编写脚本的解决方案感兴趣。

假设您领先于
master
(或您正在处理的任何分支),并运行
git status
,您将看到如下内容:

Your branch is ahead of 'origin/master' by 1 commit.
最简单的方法是运行
过滤器分支
,然后再次运行
状态
。如果所有更改都不影响已推送的提交,则消息不会更改。如果您确实更改了推送的内容,则消息将变为:

Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.

如果您想退出,请在运行
过滤器分支之前保存提交SHA,您可以使用
git reset返回到它--硬SHA

我应该强调我正在寻找一个可编写脚本的解决方案。我目前的解决方案相当繁重,可能无法在所有情况下都起作用:

#!/bin/bash

COMMIT="$1"

git log --format="%H %h %s" --ancestry-path $COMMIT"^.." | \
grep -f \
  <(comm -12 \
    <(git log --format=%H --ancestry-path $COMMIT"^.." | sort) \
    <(git log --format=%H $(git for-each-ref --format="%(refname)" refs/remotes/) | sort)\
  ) | \
cut -d " " -f 2- | grep "." && { echo 'Some already pushed commits are affected!'; exit 1; }

git filter-branch ... --ancestry-path $COMMIT"^.."
#/bin/bash
COMMIT=“$1”
git日志--format=“%H%H%s”--祖先路径$COMMIT“^..”\
grep-f\

我想知道请求原谅是否比请求许可更容易:只需进行更改并尝试推送
git
,如果失败,则恢复
筛选器分支
更改。仅检查立即
a^
子级难道还不够吗?(如果我正确理解你的情况,应该是
A
)。如果未推送它们,则它们上面的任何提交都不会按要求推送well@max630当前位置但是如何证明他们还没有被推到目前为止?(关于当前注册的remotes)类似于git branch的东西--remotes--包含一个
@max630:是的,这是一个解决方案,但我仍然需要做一些丑陋的后期处理。这似乎是一个品味的问题
git log--oneline$COMMIT..$(git branch-r--包含$COMMIT |{grep-v-->“| | echo$COMMIT;}| tail-1 | tr-d”“)| grep”。&&{echo'一些已经推送的提交会受到影响!;退出1;