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

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协议的情况下用好这个函数了。反正手动切换分支再拉取也可以。