git 强制推送到分支的别名
git alias for force pushing to branch
我有这个命令,我通常 运行 强制将我的更改推送到远程 b运行ch:
git push --force origin head:{remote-branch}
我想创建一个 git 别名,这样我就可以输入
git pfr {remote-branch}
同样的效果
我尝试将其添加到我的 .gitconfig
文件中:
pfr = push --force origin head:
但是当我 运行 git pfr {remote-branch}
使用别名时出现这个错误:
fatal: invalid refspec 'head:'
有什么想法可以实现我想要的吗?
在您的存储库中,打开终端并输入
git config --local --replace-all alias.pfr "push origin -f"
如果您希望您的别名在全球范围内存在,您可以使用 --global 选项。
git config --global --replace-all alias.pfr "push origin -f"
--replace-all
仅替换配置中先前存在的名为 pfr 的任何其他别名。
之后,您将能够做到:
git pfr branchName
并且对应的分支会被强制推送到远程
注意:如果您的分支正在被其他同事使用,则强制将分支推送到远程可能不是一个好主意,因为如果您在本地重写历史并强制推送,您的同事在尝试 merge/rebase 与您的分支。
希望对您有所帮助!
这里的问题是别名被扩展,然后附加参数作为 单独的词出现在它后面。 也就是说,prf
扩展为:
push --force origin head:
这样命令git pfr foo
就变成了:
git push --force origin head: foo
而不是您想要的命令,它是:
git push --force origin head:foo
(注意此处缺少 space——分支名称 foo
与字符串 head:
连接为一个单词)。
这种 more-fancy 别名扩展需要比 Git 的别名处理更强大的功能。您可以放弃,或者使用 shell 别名。
虽然这有点棘手。为了说明这一点,这里有一个 shell 别名,前面带有命令 echo
,它会打印它会做什么,而不是执行它:
prf = !echo git push --force origin head:
当我 运行 这样做时,它揭示了第一次尝试的问题:
$ git prf asdf
git push --force origin head:asdf asdf
</code> 扩展到第一个参数,并将其作为组合 single-word 表达式的一部分放入,因此它变成了 <code>head:asdf
。但是 </code> 参数又重复了!那是因为 Git 传递了命令 <kbd>git push --force origin head:$1</kbd> 作为 shell 应该 运行 的命令,然后 <kbd>asdf</kbd> 作为该命令的第一个参数。 shell 扩展了 <code>
,然后也保留了参数,因此 asdf
现在重复了。
要解决这个问题,我们需要让 shell 调用一个 shell 函数:
prf = "!f() { echo git push --force origin head:; }; f"
(因为这包含其他特殊字符,我们也需要引用整个内容。)运行 this 产生:
$ git prf asdf
git push --force origin head:asdf
这表明如果删除 echo
,它将做正确的事情。
请注意,如果您不为 </code> 提供一个参数,shell 无论如何都会将其扩展为空字符串。如果您提供额外的参数(将变为 <code>
等),它们将被丢弃。所以总的来说,这个别名非常脆弱,整个方法并不是一个好的方法。只要您记住它的局限性,它就适合您的特定用例——但一般来说,您应该编写 Git scripts,而不是编写花哨的别名,在其中编写一个完整的程序(在 sh / bash 中)检测和处理 所有 它的参数,检查不正确的使用,等等。
最后,请注意永远不要使用小写 head
来指代当前的提交或分支。您应该始终将其写成大写,如 HEAD
。您可以 在 Windows 和 MacOS 上使用小写变体 ,但事实证明,即使在那里,如果您使用 git worktree add
,小写变体的行为也很糟糕。如果您觉得输入 HEAD
太麻烦,请记住 @
是一个有效的同义词,因此您可以直接输入 HEAD
或其 not-very-portable 表亲 head
而不是输入一个字符 @
.
我有这个命令,我通常 运行 强制将我的更改推送到远程 b运行ch:
git push --force origin head:{remote-branch}
我想创建一个 git 别名,这样我就可以输入
git pfr {remote-branch}
同样的效果
我尝试将其添加到我的 .gitconfig
文件中:
pfr = push --force origin head:
但是当我 运行 git pfr {remote-branch}
使用别名时出现这个错误:
fatal: invalid refspec 'head:'
有什么想法可以实现我想要的吗?
在您的存储库中,打开终端并输入
git config --local --replace-all alias.pfr "push origin -f"
如果您希望您的别名在全球范围内存在,您可以使用 --global 选项。
git config --global --replace-all alias.pfr "push origin -f"
--replace-all
仅替换配置中先前存在的名为 pfr 的任何其他别名。
之后,您将能够做到:
git pfr branchName
并且对应的分支会被强制推送到远程
注意:如果您的分支正在被其他同事使用,则强制将分支推送到远程可能不是一个好主意,因为如果您在本地重写历史并强制推送,您的同事在尝试 merge/rebase 与您的分支。
希望对您有所帮助!
这里的问题是别名被扩展,然后附加参数作为 单独的词出现在它后面。 也就是说,prf
扩展为:
push --force origin head:
这样命令git pfr foo
就变成了:
git push --force origin head: foo
而不是您想要的命令,它是:
git push --force origin head:foo
(注意此处缺少 space——分支名称 foo
与字符串 head:
连接为一个单词)。
这种 more-fancy 别名扩展需要比 Git 的别名处理更强大的功能。您可以放弃,或者使用 shell 别名。
虽然这有点棘手。为了说明这一点,这里有一个 shell 别名,前面带有命令 echo
,它会打印它会做什么,而不是执行它:
prf = !echo git push --force origin head:
当我 运行 这样做时,它揭示了第一次尝试的问题:
$ git prf asdf
git push --force origin head:asdf asdf
</code> 扩展到第一个参数,并将其作为组合 single-word 表达式的一部分放入,因此它变成了 <code>head:asdf
。但是 </code> 参数又重复了!那是因为 Git 传递了命令 <kbd>git push --force origin head:$1</kbd> 作为 shell 应该 运行 的命令,然后 <kbd>asdf</kbd> 作为该命令的第一个参数。 shell 扩展了 <code>
,然后也保留了参数,因此 asdf
现在重复了。
要解决这个问题,我们需要让 shell 调用一个 shell 函数:
prf = "!f() { echo git push --force origin head:; }; f"
(因为这包含其他特殊字符,我们也需要引用整个内容。)运行 this 产生:
$ git prf asdf
git push --force origin head:asdf
这表明如果删除 echo
,它将做正确的事情。
请注意,如果您不为 </code> 提供一个参数,shell 无论如何都会将其扩展为空字符串。如果您提供额外的参数(将变为 <code>
等),它们将被丢弃。所以总的来说,这个别名非常脆弱,整个方法并不是一个好的方法。只要您记住它的局限性,它就适合您的特定用例——但一般来说,您应该编写 Git scripts,而不是编写花哨的别名,在其中编写一个完整的程序(在 sh / bash 中)检测和处理 所有 它的参数,检查不正确的使用,等等。
最后,请注意永远不要使用小写 head
来指代当前的提交或分支。您应该始终将其写成大写,如 HEAD
。您可以 在 Windows 和 MacOS 上使用小写变体 ,但事实证明,即使在那里,如果您使用 git worktree add
,小写变体的行为也很糟糕。如果您觉得输入 HEAD
太麻烦,请记住 @
是一个有效的同义词,因此您可以直接输入 HEAD
或其 not-very-portable 表亲 head
而不是输入一个字符 @
.