【问题标题】:Git push to checkout?Git推送结帐?
【发布时间】:2012-03-02 21:25:46
【问题描述】:

我想将我的文件直接推送到我的网络服务器。我将服务器添加为testing并尝试了

git push testing

但我得到this error。制作裸存储库的解决方案有效,但我希望自动签出文件。我找到了这个script,但这并没有改变任何东西。

我可以通过第三个裸存储库传输更改,但这需要很长时间:

client:
git commit -m "test" -a
git push origin
<password>

server:
git pull origin/master

更新(2)

我在服务器上创建了一个新分支git branch testing

还在我创建的服务器上 .git/hooks/post-update 并添加了:

echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log

在我运行的客户端上

git push testing HEAD:testing

现在我的/home/pi/log 包含:

a
Updating ae2f44b..04753a9
Fast-forward
 application/views/main/index.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

但是文件没有改变。还有什么问题?

【问题讨论】:

  • 至少将 fetch+merge 组合在一个 pull 中;脚本应该可以工作,要么你做错了,要么你应该能够调试东西(添加记录你的钩子以查看它为什么会中断?什么版本的 git?)
  • 我在顶部添加了echo "test" &gt; /home/pi/test .git/hooks/post-update 却一无所获。
  • 您是否进行了 chmod(针对正确的用户;考虑 chmod a+x)?你给这个脚本起什么名字?文件系统是否挂载 noexec? (如果其中任何一个修复它,我会将其发布为答案:))
  • 好的,脚本已执行,但我没有在脚本中发现错误。我会尝试 Simons 解决方案。
  • 经过多次编辑,这是一个新问题:stackoverflow.com/questions/9228921/…

标签: git


【解决方案1】:

您不能推送到已签出的分支,因为分支指针用于跟踪工作目录状态。

相反,推送到不同的分支,然后从推送钩子脚本中,将该分支合并到您的工作目录中;只要没有本地更改,此合并就会作为快进执行。

【讨论】:

  • 好的,我试过了(见更新),但我如何推入这个新分支?
  • 你的脚本有错误:exec会用命令替换当前的shell进程,所以只运行第一个命令。
  • 我修复了脚本,添加了日志记录,它看起来不错,但仍然什么也没做。查看我的更新(2)
  • 我讨厌这样的答案。不要偷懒,请包含代码/。
【解决方案2】:

你现在是"push-to-deploy" (git 2.4, May 2015),它比"push-to-checkout" (Git 2.3, February 2015) 有所改进。

具体示例请参见“Deploy a project using Git push”。

简而言之,您可以直接推送到已签出的分支(带有警告)。
commit 4d7a5ce


更新:使用 Git 2.30(2021 年第一季度),您现在有一个示例 'push-to-checkout' 挂钩,其执行与内置默认操作相同。

参见Adam Spiers (aspiers)commit e632c46(2020 年 10 月 15 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit df7f850,2020 年 11 月 2 日)

hook:为push-to-checkout 添加示例模板

签字人:Adam Spiers

该模板或多或少精确地转换为 C 代码的 shell,用于在 builtin/receive-pack.cpush_to_deploy() 函数中定义的 git 的 push-to-checkout 钩子的默认行为,作为一个方便的开始修改点。

它还包含从 git-config(1) 和 githooks(5) 手册页中提取的相关文本。

即:

在 git push 上更新签出树的示例挂钩脚本。

git-receive-pack 响应git push 并更新其存储库中的引用时,以及当推送尝试更新当前签出的分支并且receive.denyCurrentBranch 配置变量为设置为updateInstead

默认情况下,如果工作树和索引 远程存储库与当前有任何不同 签出提交;当工作树和索引都匹配时 当前提交,它们会更新以匹配新推送的提示 分公司。

这个钩子是用来覆盖默认的 行为;但是下面的代码重新实现了默认行为 作为方便修改的起点。

钩子接收当前的提示的提交 分支即将更新:

commit=$1

它可以以非零状态退出以拒绝推送(当它拒绝推送时) 因此,它不能修改索引或工作树)。

die () {
   echo >&2 "$*"
   exit 1
}

或者它可以对工作树和 索引以使它们在当前的尖端时达到所需的状态 分支更新为新的提交,并以零状态退出。

例如,钩子可以简单地运行git read-tree -u -m HEAD "$1" 为了模拟以相反方向运行的git fetchgit push,因为git read-tree -u -m 的两树形式是 与切换的git switchgit checkout 基本相同 分支,同时保持工作树中的本地更改 不干扰分支之间的差异。

以下是对 C 代码外壳的或多或少精确的翻译 对于 git 的 push-to-checkout 钩子的默认行为定义在 builtin/receive-pack.c 中的 push_to_deploy() 函数。

请注意,钩子将从存储库目录执行, 不是来自工作树,所以如果你想对 工作树,您将不得不相应地调整您的代码,例如 通过添加“cd ..”或使用相对路径。

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2017-09-24
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多