用于暂存所有未经修改重命名的文件的简单命令

Simple command to stage all files that were renamed without modifications

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

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

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

  1. 暂存所有文件
  2. 取消暂存除路径重命名之外的所有修改文件

我该怎么做?

git status --porcelain=v2区分正常变化和renames/copies.
您可以将其添加到 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 即使只有重命名也会重置)。

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

更简洁的方法:

git add .
( IFS=$'\n'
  git reset $(git diff-index -M  --find-renames=100% --diff-filter=r --name-only @)
)