0

当我重命名整个文件夹或进行重构时,我认为最好将重命名操作隔离在其自己的单独提交上。如果我将它与其他未决修改混合,我只会使提交的验证复杂化。因此,提交应该只有路径重命名操作而没有其他修改,除非它们被重命名为重构操作固有的引用(但我会手动暂存这些)。

是否有一个简单的 git 命令(或我可以添加到 ~/.bash_aliases 的 shell 脚本/函数),我可以使用它来暂存所有已重命名且没有其他修改的文件,只有那些?

为简单起见,您可以假设没有其他任何内容已上演,因此您可以将其分为 2 步,例如:

  1. 暂存所有文件
  2. 取消暂存所有修改过的文件,而不仅仅是路径重命名

我该怎么做?

4

3 回答 3

2

更清洁的方式:

git add .
( IFS=$'\n'
  git reset $(git diff-index -M  --find-renames=100% --diff-filter=r --name-only @)
)
于 2020-11-15T19:14:05.017 回答
1

git status --porcelain=v2区分正常更改和重命名/副本。
您可以将其添加到 bash_aliases:

function gitStageRenamed() {
  git add -A &&
  git status --find-renames=100% --porcelain=v2 |
  grep ^1 | cut -d' ' -f 9- | xargs -rd'\n' git reset
}

这需要所有正常的编辑(以 开头的行1),获取路径,并将它们传递给git reset.

如果您不使用 GNU xargs (Mac),请去掉-rd'\n',尽管它不会那么健壮(不会处理带空格的文件名,并且即使只有重命名也可能会运行 git reset )。

于 2020-11-13T22:39:13.690 回答
1

git status --find-renames=100% --porcelain将标记为“重命名”的只是纯重命名。

这是一个使用它的脚本:

#!/bin/bash

git add -A
git status --find-renames=100% --porcelain | grep -v "^R " | cut -c 4- | xargs git reset
于 2020-11-13T22:54:36.760 回答