[magit] 如何 stage 一部分修改?

不能折叠肯定是有问题,不是文件的锅。之前我开了ws-bulter,magit里就没法折叠diff

这个问题我还没遇到过,以后关注下。不过 unstage 的问题总感觉是操作哪里不对

哈哈,楼主终于入坑 magit 了。

我碰到过一种只能整个文件 stage 的是,当文件涉及中文,文件的编码和 magit 的编码设置有些问题的时候会出现(具体怎么回事没有搞明白,出现这种情况的时候一般就去命令行 git add -i );不过一般 ascii 和 utf8 编码没什么问题。

另外可以在 magit buffer 按 $ ,可以看到对应执行的命令是啥,然后去命令行测试对比下。

建议看看这个视频 2018-12-11: It's Magit! - John Wiegley - YouTube

文字描述的确会有不周的地方,现在我写了一个最小配置(包括自动测试步骤)放在 1 楼。从测试脚本可以一览整个测试过程以及意图。

问题在我电脑上是 100% 重现的,也欢迎大家下载测试。脚本使用并不复杂,一行命令就可以了。

或者我的理解不对,以至于整个测试的逻辑都错了,也欢迎指出。

我用你的脚本做了下测试,唯一的区别是修改了git路径,注释了 cl-assert。环境是 macOS 10.15.3,GNU Emacs 28.0.50. 录了一个视频:

emacs

1 个赞

所以,正常情况下,测试脚本是可以 stage 修改内容的。

但是我这里不知为何没有 Unstaged changes 段,所以无法进行 stage 操作。

因为 Status buffer 的每个 Section 都有各自的按键绑定。所以我其实是在一个非 Unstage changes 段(虽然测试脚本 search 到的位置看上去有点像,但其实并不是)上试图进行 stage 操作,结果当然是失败。

我继续手动做了些操作,功能是完全正常的。问题应该是在测试脚本上。

emacs

我认为脚本没有影响到 magit 功能发挥,只不过我把找不到 Uncaged changes 和无法 stage 表述成 expected,在没遇到问题的人看来有点绕。

我再改一下,按正常情况来下断言。

我的理解是,你想在命令行下操作,然后在 magit 下检查 unstage 和 stage 功能。不知道对不对? 这样的话,不一定要用 elisp 代码,直接用简单的 shell 命令操作,然后列出每一步你的预期和结果。 另外,还可以全部用 magit 操作一遍,看看是否达到你的预期。

在我的使用经验中,这些场景下都没遇到问题。也许我用的命令不复杂吧。

  • 命令行肯定没问题,以我多年 git 使用经验保证,以及我电脑上安装的 git 也没有崩坏,直到发出这个回帖的前一秒都还在用。
  • 之前就是全部用手动 magit 操作,但用文字描述出来之后,大家可能会觉的有哪些地方没交代清楚,所以改为脚本。

建议全部用 magit 操作,详细描述步骤包括按键,配上截图,大家应该就明白了。 如果真的是 magit bug,肯定有人报 issue 了。

会不会是gitconfig的问题?我之前设了个color结果magit炸了。有可能是什么设置和magit冲突了

问题果然出在 ~/.gitconfig

刚刚把 ~/.gitconfig 文件删掉,再跑脚本就能自动 stage 了。

Screenshot_2020-03-05_at_8.39.09_PM

之前也很怀疑是不是我用的一个叫 diff-so-fancy 的 pager 引起的,但是看了 magit 的默认参数 magit-git-global-arguments 里边有 --no-pager,所以就排除了 diff-so-fancy 的嫌疑。

接下来就是进一步锁定是哪一项配置引起的。


如楼上所说,的确是 color 引起的:

# ~/.gitconfig
[color]
    ui = always
1 个赞

msgit应该加入一个提醒,如果开启了color就提示用户才好。

这个问题虽然不报错,但是影响到功能的完整性,我认为可以算是设计上的疏忽。

要么默认加上 "-c" "color.ui=false" 参数,要么直接报错,不能把问题 “try…catch” 隐藏起来。

我的 .gitconfig 配置是这样的

[core]
    editor = vim
    pager = diff-so-fancy | less --tabs=4 -RFX
[diff]
    tool = meld
[difftool]
    prompt = false
[merge]
    tool = meld
[mergetool]
    prompt = false
[alias]
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
[color]
    ui = true
[color "diff-highlight"]
    oldNormal = red bold
    oldHighlight = red bold 52
    newNormal = green bold
    newHighlight = green bold 22
[color "diff"]
    meta = yellow
    frag = magenta bold
    commit = yellow bold
    old = red bold
    new = green bold
    whitespace = red reverse

这里设置了 ui=true 没有问题。可能是 magit 没有处理 color escape sequence 导致的.

相关 issue

相关链接

https://magit.vc/manual/magit/Diffs-contain-control-sequences.html

原来如此,true的话别的软件消耗git的输出时没有颜色,只有在shell里有。always的话就都有有。

可以给 magit 提个 issue,完善一下。这个也不算是设计上的问题,太多场景无法一一覆盖到。

提了 issue 并给出建议了,就看是否采纳了。

多数人可能遇不到这个问题,因为如果用户第一时间解决终端输出色彩乱码问题,就在不知不觉中把这个问题也捎带解决了。

说“捎带解决”是有道理的,在创建中 Unstaged changes 段的时候,magit 用正则提取的 diff 结果中的文件名,但是如果存在色彩代码,正则表达式不匹配直接退出,就把 diff 结果丢弃了。

我本来想提个 pr,但是解法有几种,一时拿不定主意:改默认参数,改正则,改函数返回。

4 个赞