• 软件开源
  • [已解决]如何修改人家贡献的PR,不想先合并再修改

如果你在 Github 上正确配置了 SSH 公钥,那么用 git@github.com:cosname/cosx.org.git地址克隆。

好在 git-bash 和普通 bash 一样可以用history看历史代码,我翻到了这条git clone git@github.com:cosname/cosx.org.git,这应该就是当初我克隆cosx.org库的那条,不过我执行完这段以后才发现应该要指定克隆到本地的文件目录。而且后面我瞎操作想要切换分支的时候出问题了,我克隆了两次,所以现在那个目录如此混乱。但至少是不是说明我还是正确配置了SSH钥匙?

Cloud2016

看到了。

$ ssh -T git@github.com
Warning: Permanently added the ECDSA host key for IP address '140.82.113.3' to the list of known hosts.
Hi earfanfan! You've successfully authenticated, but GitHub does not provide shell access.

yihui

突然感觉 Git 对我来说是最难解释清楚的技术问题,尤其是 Windows 下,分分钟让我有种黔驴技穷、穷途末路、路见不平拔刀自刎的感觉……

冷静点。即使益辉是大神,很想要帮我解决问题,但是也留给我这个菜鸟一点消化理解的时间。到点就去睡吧。一口气解释不清楚没关系的啊喂。

这波等我搞清楚我是缺了哪些常识,我一定勤勤恳恳写一个超级新手入门级的博客来解释我遇到的这些问题和答案。

不是黔驴技穷,应该是鄂驴。

还有一个小问题,如下:

This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.

为何把“SSH keys”翻译成SSH 公钥?虽然我英文菜,但是刚好这句话里面的单词我都认识,我看的时候脑子里翻译的是SSH 钥匙。仅仅从这一小点来看,益辉解释不清楚的原因其实也是因为,菜鸟如我并不知道一些 git 这个工具的领域内一些默认的常识。

    yuanfan ssh key 字面意思确实是 ssh 密钥。

    ssh 密钥有两个:公钥、私钥。私钥用于证明你是袁凡,公钥用来验证你是袁凡。你上传到 GitHub 的密钥是用来验证身份的。

    虽然 ssh keys 没明说是 public key,但你根据它的作用可以推断。可能写 ssh public key 太啰嗦了,就省略成 ssh key。

    其实我觉得现在的审稿制度可能应该双向进行,现在的PR模式可能把很多编辑的责任转嫁到了作者身上,导致要给主页投稿,还得安装一堆blogdown的依赖,还要在本地编译历史所有的历史投稿,感觉不合理

    我提议作者自己搞个Repo装单一一篇文章Rmd和所需的内容,而编辑再负责将内容整合进主站。这样作者可以把更多精力专注于内容而不是诸如这篇帖子讨论的git怎么用的细节上…

      tctcab 现有投稿指南其实没考虑过 Rmd 文档的投稿的,如果是md文档投稿的话,那么其实可以在线编辑PR都不用把仓库拖到本地。只不过我们目前并不运行 blogdown 去编译 Rmd 文档,所以还是需要投稿时先生成 html 或 md 才能看到预览来方便审稿。因此其实不装blogdown都可以投稿的,只是需要一个编译好的文件。

      不过加个 GitHub Action 来编译应该也不困难,这样 Rmd 投稿就可以自动生成预览了,审稿也会方便些。只不过这样我们就得要求作者用 renv 包来锁定调用的包了,否侧 Rmd 文档用GHA也会因为缺少必要的包而编译失败,这样还不如本地编译成 html 或 md 推送过来方便。只不过这篇文章本身的零部件就不少,所以看起来麻烦了点。

      作者当然可以搞一个只有一篇Rmd的repo交给编辑来处理,编辑这边转给审稿人,但这样就不如在线审稿方便透明了。当然,具体到 git,确实是有点门槛的,特别是涉及要改别人的 PR 这种。

      伙伴们,我还在坑底……

      我今天把 git 卸载重新安装,在安装 git 那个文件夹以外新建了一个目录存放克隆下来的库。
      然后重新生成了 id_rsa 和 id_rsa.pub 这两个文件,并且把 id_rsa.pub 中的内容复制粘贴放到了 github 账户中,检查了一下我在 github 网页上设置的钥匙,内容和 rstudio 上的 public key 内容确实是一样的。

      奇怪的是,怎么之前设置的钥匙是绿色的(源于id_ed25519.pub文件),今天这个钥匙是灰色的?而且 rstudio 的 Tools -> global options -->Git/SVN 选项下自动填入了SSH RSA keys,都没给我机会填那个绿色的钥匙。

      所以当我再一次把cosname/cosx.org克隆下来,进入我本地的cosx.org文件夹下,打开cosx.Rproj,在rstudio中输入usethis::pr_fetch(1019)还是报错了:

      √ Setting active project to 'D:/R/myGit/cosx.org'
      √ Checking out PR 'cosname/cosx.org/#1019' (@XiangyunHuang): '投稿:探索定西市的 Sci-Hub 流量之谜 袁凡'.
      Error in libgit2::git_remote_fetch : Authentication failure

      湘云给的常识书也看了,但还是没明白咋回事。网上搜到一个答案:https://stackoverflow.com/questions/26953071/github-authentication-failed-github-does-not-provide-shell-access照着在cosx.org目录下执行git remote set-url origin git@github.com:cosname/cosx.org.git然后再去rstudio中抓1019也还是报一样的错。

        yuanfan 绿色的钥匙🔑是因为你最近有用到它,灰色的表示你最近没有用它。

          Cloud2016 理论上来讲,我在 rstudio 执行抓取远程仓库这个动作时就会用到那个rsa钥匙 啊,既然灰色表示没用过就是说我在rstudio执行的时候这个钥匙没起到作用么

          伙伴们,虽然不知道为什么在rstudio中执行代码会报错,但是我在rstudio右上角的窗口手动切换到远程scihub那个分支,并且手动点击了pull按钮,终于把我想要拉过来的文件弄到本地了。

          不过看那个文件的时间点,还不一定是我手动操作以后拉到本地的,说不定前面在 rstudio 中虽然执行代码报错,但是还是把文件拉过来了。

          yuanfan 因为我本地已经有 1019 号 PR 对应的分支了,所以我尝试了 1018 号 PR,过程很顺畅。

          usethis::pr_fetch(1018)
          ✓ Setting active project to '/Users/xiangyun/Documents/Github/cosx.org'
          ✓ Checking out PR 'cosname/cosx.org/#1018' (@plumberDong): '投稿:核酸检测准确率是多少?Plumber'.
          ✓ Adding remote 'plumberDong' as 'https://github.com/plumberDong/cosx.org.git'.
          ✓ Creating and switching to local branch 'plumberDong-patch-3'.
          ✓ Setting 'plumberDong/patch-3' as remote tracking branch.

          你那是网不好还是 Git 环境没有配置好呢?

          P.S. 环境信息如下

          xfun::session_info(c('blogdown','rmarkdown','usethis'),dependencies = F)
          R version 4.1.3 (2022-03-10)
          Platform: x86_64-apple-darwin17.0 (64-bit)
          Running under: macOS Monterey 12.3, RStudio 2022.2.1.461
          
          Locale: en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8
          
          Package version:
            blogdown_1.9   rmarkdown_2.13 usethis_2.1.5 
          
          
          Pandoc version: 2.17.1.1

          yuanfan 前两天有点忙没顾上此事,昨天仔细研究了一下,我觉得这个密钥验证问题应该也有望解决了,而且也不难。首先,点此链接创建一个个人令牌(Personal Access Token),其中 Expiration 可以选择 No expiration,这样这个令牌以后可以一直用(默认是 30 天过期,这是为了避免令牌不慎泄露)。然后,在 R 里运行:gitcreds::gitcreds_set(),复制刚才创建的令牌,粘贴进来。最后,把你的 Git 库的远端地址改为 https 版本的:git remote set-url origin https://github.com/cosname/cosx.org.git 我估计这样三步操作之后应该就好了。

          一丁点背景知识(其实我上一条回复已经提到过了):Git 库有两种克隆方式,一种是用 git 协议,一种是 https 协议。前者地址形如 git@github.com:cosname/cosx.org.git,后者形如 https://github.com/cosname/cosx.org.git。前者的验证要通过 SSH 钥匙,就是你折腾的那些东西,也是我个人一直用的方式;后者的验证是通过令牌,相当于密码。配置令牌比配置密钥要稍微简单一点,唯一的问题是安全性可能略差一些。

            yihui
            你的办法好使。我试了试:

            > usethis::pr_fetch(1018)
            √ Setting active project to 'D:/R/myGit/cosx.org'
            √ Checking out PR 'cosname/cosx.org/#1018' (@plumberDong): '投稿:核酸检测准确率是多少?Plumber'.
            √ Adding remote 'plumberDong' as 'https://github.com/plumberDong/cosx.org.git'.
            Error in libgit2::git_remote_fetch : 
              failed to send request: The operation timed out

            报的这个 time out 错是我的网不给力。

            你的解题思路我看明白了,因为之前看到湘云的执行结果中这段Adding remote 'plumberDong' as 'https://github.com/plumberDong/cosx.org.git'.就往这个方向猜。但是我当时只配置了 ssh 协议,而usethis::pr_fetch()这个函数看上去似乎默认添加远程分支时使用的 https 协议,可是我又想这个函数的开发者应该知道存在好多种协议,不可能只默认其中一种吧。

            这里https://github.com/r-lib/usethis/blob/main/R/pr.R第94-101行是这个函数的注释,其中提到:

            The transport protocol (HTTPS vs SSH) for any new remote is inherited from the remote representing the source repo.

            不过这内容太长,我也懒得深究怎么只配置了ssh协议的情况下用好这个函数了。反正手动切换分支再拉取也可以。