我手动移动了一个文件,然后修改了它。根据Git,它是一个新文件和一个已删除的文件。有什么方法可以强制Git将其视为文件移动吗?


当前回答

在不同的提交中执行移动和修改操作。

其他回答

If you're using TortoiseGit it's important to note that Git's automatic rename detection happens during commit but the fact that this is going to happen isn't always displayed by the software beforehand. I had moved two files to a different directory and performed some slight edits. I use TortoiseGit as my commit tool and the Changes made list showed the files being deleted and added, not moved. Running git status from the command line showed a similar situation. However after committing the files, they showed up as being renamed in the log. So the answer to your question is, as long as you haven't done anything too drastic, Git should pick up the rename automatically.

编辑:显然,如果你添加新文件,然后从命令行执行git状态,重命名应该在提交前显示。

编辑2:另外,在TortoiseGit中,在提交对话框中添加新文件,但不要提交它们。然后,如果您进入Show Log命令并查看工作目录,您将看到Git是否在提交前检测到重命名。

同样的问题在这里被提出:https://tortoisegit.org/issue/1389,并已被记录为一个bug来修复这里:https://tortoisegit.org/issue/1440。原来这是一个显示问题与TortoiseGit的提交对话框,也存在于git状态,如果你没有添加新文件。

我最近在移动(但不是修改)一些文件时遇到了这个问题。

问题是,当我移动文件时,Git更改了一些行结束符,然后无法判断文件是否相同。

使用git mv解决了这个问题,但它只能在单个文件/目录上工作,而且我在存储库的根目录下有很多文件要做。

解决这个问题的一种方法是使用bash /批处理魔法。

另一种方法如下

移动文件,git提交。这将更新行结束符。 将文件移回原来的位置,现在它们有了新的行结束符,git提交—修改 再次移动文件,git提交—修改。这次行结束符没有变化,所以Git很高兴

对我来说,在提交之前保存所有更改并再次弹出它们是有效的。这使得git重新分析添加/删除的文件,并正确地将它们标记为已移动。

其他的答案已经涵盖了,你可以简单地git添加新&& git rm OLD,以使git识别移动。

然而,如果你已经在工作目录中修改了文件,add+rm方法将把修改添加到索引中,这在某些情况下可能是不希望的(例如,在大量修改的情况下,Git可能不再识别它是一个文件重命名)。

让我们假设您想要将重命名添加到索引,而不是任何修改。显而易见的方法来实现这一点,是做一个来回重命名mv NEW OLD && git mv OLD NEW。

但是也有一种(稍微复杂一点的)方法可以直接在索引中做这件事,而不需要在工作树中重命名文件:

info=$(git ls-files -s -- "OLD" | cut -d' ' -f-2 | tr ' ' ,)
git update-index --add --cacheinfo "$info,NEW" &&
  git rm --cached "$old"

这也可以放在~/.gitconfig中作为别名:

[alias]
    mv-index = "!f() { \
      old=\"$1\"; \
      new=\"$2\"; \
      info=$(git ls-files -s -- \"$old\" | cut -d' ' -f-2 | tr ' ' ,); \
      git update-index --add --cacheinfo \"$info,$new\" && \
      git rm --cached \"$old\"; \
    }; f"

git diff -M或git log -M会自动检测这些更改,如重命名和微小的更改,只要它们确实是。 如果你的小变化不是小的,你可以降低相似度阈值,例如。

$ git log -M20 -p --stat

将其从默认的50%降低到20%。