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

Cloud2016
我想修改https://github.com/cosname/cosx.org/pull/1019里面文章的内容,但是没看明白你们上面讨论的东西。

我从这里git fetch origin refs/pull/771/head:patch-2开始执行就报错了。

$ git fetch origin git@github.com:cosname/cosx.org/pull/1019/head:patch-1
fatal: invalid refspec 'git@github.com:cosname/cosx.org/pull/1019/head:patch-1'

没琢磨出来refs是什么意思,于是照着https://tighten.com/blog/adding-commits-to-a-pull-request/又鼓捣了一下,我是这么操作的:

#克隆仓库到本地
git clone git@github.com:cosname/cosx.org.git
#为了查看别人提交的PR,增加一个remote?
git remote add XiangyunHuang git@github.com:cosname/cosx.org.git
#查看分支目录
git remote -v
#看到了
`XiangyunHuang   git@github.com:cosname/cosx.org.git (fetch)`
`XiangyunHuang   git@github.com:cosname/cosx.org.git (push)`
#又抓取了什么?
git fetch XiangyunHuang
```
remote: Enumerating objects: 10258, done.
remote: Counting objects: 100% (936/936), done.
remote: Compressing objects: 100% (616/616), done.
remote: Total 10258 (delta 597), reused 525 (delta 289), pack-reused 9322
Receiving objects: 100% (10258/10258), 9.49 MiB | 16.00 KiB/s, done.
Resolving deltas: 100% (7973/7973), done.
From github.com:cosname/cosx.org
 * [new branch]      beamer-down         -> XiangyunHuang/beamer-down
 * [new branch]      master              -> XiangyunHuang/master
 * [new branch]      scihub              -> XiangyunHuang/scihub
 * [new branch]      鏇存柊澶氬閿欏埆瀛?缂栧彿 -> XiangyunHuang/鏇存柊澶氬閿欏埆瀛?缂栧彿
```

但是好像并没有把我想改的内容抓到本地,而是只是把cosname/cosx.org的内容抓到了本地。

    yuanfan 好了,眼看你快要掉到无底洞里,快别折腾了,我把你加到编辑组里,你在 Github 上接受一下邀请,然后对 cosx.org 这个库就有写的权限了。接下来有且仅有一步操作:

    usethis::pr_fetch(1019)

    改完了就是普通的 git commit/push 操作,都可以在 RStudio 的 GIT 栏中点击操作。等到将来 PR 合并之后:

    usethis::pr_finish()

    清扫干净历史痕迹。

    以上对任何一个你有写权限的 GitHub 库都适用。上面的所有回复全都可以丢进历史垃圾箱不用再看了。

      8 天 后

      yihui
      在运行下面这步之前,我是不是漏了什么常识性操作?或者我是不是还应该先学点git常识?

      usethis::pr_fetch(1019)

      我直接在RStudio里面执行,报错了,错误如下:

      由于我也很迷,不知道还应该提供点什么参考信息,附上我电脑上现在装了git那个文件夹的目录:

      在单击git-bash.exe后弹出来那个黑色窗口执行以后也是报错:

      $ usethis::pr_fetch(1019)
      bash: syntax error near unexpected token `1019'

      本来我想当个普通青年的,因为给了我一个什么权限以后,就可以直接去修改稿件中的 index.rmd 文档,然而我现在需要照着三水大人所言重新上传一部分数据,以及修改一个 index.html 文档,所以还是得琢磨下怎么把内容抓到本地来修改。哈哈,还好审稿的tc君还没审,我还可以继续漫长卡关。

        yuanfan 你这个 D 盘下的 R/Git 目录看得我好晕,文件们怎么会乱成如此这般一锅粥咧……本来我打算睡觉去了,这一锅粥看得我又清醒了。你好像把至少三样东西杂糅到同一个文件夹下了:git 软件(git-bash.exe 等)、cosx.org 库(cosx.org 文件夹)、cosx.org 库下的文件和文件夹(content 等文件夹)。

        首先,Git 不用和某个 Git 库放在一起,安装的时候按默认路径装就可以了(当然,修改安装路径也行,只是别和 Git 库混在一起)。

        然后,克隆库;如果你在 Github 上正确配置了 SSH 公钥,那么用 git@github.com:cosname/cosx.org.git 地址克隆。如果不会配置,那明天我再看看用 https 协议是怎么配置密码的(相应地用 https://github.com/cosname/cosx.org.git 地址克隆)。我自己一直都是用 SSH 钥匙的,但我不熟悉 Windows 下的 SSH 配置。

        最后,假设上面的库克隆到了单独的文件夹下,那么进入那个文件夹,打开 cosx.Rproj,再运行 usethis::pr_fetch(1019) 应该就可以了。它是 R 代码,不能在 git-bash 窗口中运行。

        yuanfan 或者我是不是还应该先学点git常识?

        只要你以前曾经从本地成功向 Github 提交过任何更改,那么就说明你的 Git 配置都是好的,也不需要任何其它 Git 知识了。感觉你好像通常都是在 Github 网站界面上直接操作的。

        yuanfan 我直接在RStudio里面执行,报错了,错误如下:

        报错可能是因为你打开的并不是一个正常克隆下来 Git 库。否则这个 Git 库应该会有远端地址(而你打开的没有,Git 不知道你的库的远端地址,所以无法从远端拉取记录)。


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

          yihui
          我的git配置应该是好的,但只有一点是好的,打开rstudio是能连上github上面我的账号的。大约一周多以前卡关的时候,我照着网上搜来的信息瞎改了一些东西,你所述的SSH配置,我这边长这样,但不知道是不是好使的:

          虽然我是2021年开始写博客,但是其实我建博客前前后后卡了半年多(因为不会科学上网,用不了netlify,后来改用vercel),只有第一次把各种文件一股脑传到github上是git commit然后push,后来2021年1月底春节期间打算学习git,瞎操作把博客整崩了,又瞎操作一通恢复以后就不用命令了,全都是“Add files via upload”。所以说,我写我缺乏常识不是表示我自卑,也不是菲薄自己,哈哈,是真得觉得缺乏常识。但我也不知道缺乏些什么常识。哈哈,好绕。

          如你所说,我之前确实抓取过cosx.org库到本地,现在进入这个文件夹,里面有个cosx.Rproj,单击一下直接就打开了Rstudio,执行你给的代码报错如下:

          Error in libgit2::git_remote_fetch : Authentication failure

          这个错看字面意思是说身份验证失败,这一通绕回来,好像还是我哪里配置的不对。

            yuanfan 打开 Git Bash 窗口,输入如下命令

            ssh -T git@github.com

            是否可以看到类似如下的信息?

            Hi XiangyunHuang! You've successfully authenticated, but GitHub does not provide shell access.

              如果你在 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 钥匙,就是你折腾的那些东西,也是我个人一直用的方式;后者的验证是通过令牌,相当于密码。配置令牌比配置密钥要稍微简单一点,唯一的问题是安全性可能略差一些。