1

git log -M --follow --full-history new/directory/file甚至失败时,如何让 git log 向我显示文件的整个历史记录。

但首先是关于未显示更改的一些上下文......

我们在另一个仓库中导入了一个 git 仓库,我们是这样进行的:

git clone git@domain.com:namespace/NewRepository
cd NewRepository
git remote add oldRepository git@domain.com:oldNamespace/oldRepository.git
git fetch oldRepository
git checkout -b old-master oldRepository/master
mkdir -p new/directory/
git mv -k * new/directory/
find . -name ".*" -d 1 -exec git mv -k {} new/directory/ \;
git commit -m "Move oldRepository to its new location"
git push --set-upstream origin old-master
git checkout master
git pull
git merge old-master --allow-unrelated-histories
git push

到目前为止一切顺利,在此之后 agit log --follow new/directory/file会给我文件的完整变更日志。

大约一周后,需要将旧存储库的一些新更改“拉入”到新存储库中。我们是这样进行的:

git fetch --all
git checkout old-master; 
git merge origin/old-master; # I got no conflict (No change actually)
git merge origin/master; # I got no conflict (As expected)

git merge -s subtree -X patience oldRepository/master; 
# I am not sure "-X patience" is a thing but that's what we ran.
# But the "-s subtree" is the important part I believe, we got no conflict and all expected changes were found in their new location (Even newly created files)

git push --set-upstream origin old-master

然后我创建了一个 PR,然后最终使用create a merge commit选项将其合并。

现在,如果我执行git log --follow new/directory/file最新的提交,我看到的是:Move old repository to its new location,但是我没有从旧存储库中获得任何更新的条目,这些条目是在原始导入之后完成的。尽管文件中存在更改。

然而 :

  • Agit blame new/directory/file确实在修改后的行旁边向我显示了正确的信息
  • A git log(没有指定文件)确实向我展示了提交
  • 我的 IDE 中的 Ashow history确实向我显示了日志条目。

由于我的 IDE 做到了,我猜测 git log 有一个标志组合来向我显示正确的历史记录,但我尝试了很多组合但无法弄清楚。是的,我确实阅读了手册页...

此外,如果不同的程序可以阻止我进入这种情况,我想知道...... Doe 回想起来也许老主分支是不必要的,但最初似乎有一个分支来解决冲突是个好主意.

谢谢!

4

1 回答 1

0

如果合并提交没有对目标文件引入额外的修改,git log new/directory/file则不会显示合并提交本身(这可能有点令人不安),并且根据它选择显示提交的顺序,来自您的old-master分支的提交可能会进一步在log列表中。

尝试添加--graph选项:

git log --graph --follow new/directory/file
# or
git log --graph --oneline --follow new/directory/file

并查看您是否对修改该文件的提交有更清晰的了解。

您也可以尝试--date-order,--author-date-order--topo-order标志。


new/directory[编辑] 当我第一次阅读你的问题时,我不知何故认为oldRepository. 所以我推断 . 中的修改oldRepository被应用于new/directory/file,我发现 git 不会列出new/directory/file.

我现在明白,在 中oldRepository,文件的路径是/file,并且包括新提交作为git log --follow new/directory/file依赖 git 启发式查找重命名的一部分。

关于中的选项git log,您是否尝试过:

  • 使用-C--find-copies-harder
  • -M使用?设置较低的检测阈值 (-M40%例如,默认值为 50%) ?
  • 如果两个 repos 之间的 crlf 行结尾不同:--ignore-cr-at-eol
  • 设置选项以忽略空格更改:--ignore-whitespace-at-eol-b

关于 git 中的“重命名”:您当然知道 git 不会在其历史中跟踪重命名,它只是跟踪您告诉它存储的内容。当它在or或 ...
中显示“重命名”时,它实际上试图猜测哪些文件可能已被重命名,以查看全局内容之间的差异。例如,该选项表示如果 50% 的文件相同,它将认为可能已“移动” 。git loggit status-M50%file Bfile A

于 2020-08-07T07:59:07.333 回答