了解 git 如何删除一个应该被忽略的文件

Find out how git removed a file that should be ignored

我目前有一个 git 存储库设置为裸存储库,然后 git checkout -fs 到 public 文件夹进行发布。最近提交的内容似乎删除了 .gitignore.

中的文件

有没有办法查看该文件是如何被删除的?将这些更改拉到我的本地也删除了我机器上的文件:

nic@TALRASHA:/mnt/code/repository$ git pull
remote: Counting objects: 42, done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 26 (delta 18), reused 9 (delta 6)
Unpacking objects: 100% (26/26), done.
From ssh://[server-address]/var/www/vhosts/thewebsite/repository
   f470eff..82dc3bf  live       -> server/live
Updating f470eff..82dc3bf
Fast-forward
 application/views/templates/owners/default.php |  20 +++++++++++---------
 layout/owners/images/sprites-mobile-pages.png  | Bin 0 -> 89606 bytes
 layout/owners/js/owners.js                     |  44 ++++++
 src/less/layout/owners/dashboard.less          |  25 +++++++++++++++----
 4 files changed, 76 insertions(+), 13 deletions(-)
 create mode 100644 layout/owners/images/sprites-mobile-pages.png

运行 git log --follow -- filename returns 空白结果。 运行 git ls-files filename --error-unmatch returns "error: pathspec 'filename' did not match any file(s) known to git."

A git checkout 可以删除您忽略的、未跟踪的文件之一。如果其他人在不同的分支中跟踪该文件,则可能会发生这种情况。

取证

确定某人是否跟踪了他们不应该跟踪的文件的一种方法是 运行 git log 并通过文件名进行限制。

git log --follow -- filename.ext

如果您不需要跟踪重命名,可以使用简化搜索。

git log -- filename.txt

两者都将显示影响 filename.ext 文件的提交。第一个(--follow)也将检测重命名。按路径搜索时,-- 必须在 filename.ext 之前,以告知 git 这是一个文件名。

场景/示例

这是 PowerShell 中 git 的一个场景,其中有人可能添加了一个被忽略的文件。

创建并初始化本地 git 存储库

new-item -type directory "repo"
cd repo
git init

添加一个git忽略和一个test.txt文件来忽略

new-item -type file ".gitignore"
add-content .gitignore "*.txt" 
new-item -type file "test.txt"
git add -A;
git commit -m "Add gitignore";

此时,git 未跟踪 test.txt,因为它已被忽略。

强制添加 test.txt 文件

git add -f test.txt
git commit -n "Force add test.txt"

Git 现在正在跟踪 test.txt,检查 HEAD~1 将删除它,即使它在您的 .gitignore 中。

检查您之前的提交以删除被忽略的 test.txt

git checkout HEAD~1
# this will delete the "ignored" file.

同样,如果另一个人(force)添加了 test.txt 文件,他们分支的签出可能会删除您忽略的、未跟踪的文件。

我找到了原因:git用于跟踪合并提交的分支中的文件,在主分支的日志中没有留下任何痕迹。查看合并分支的日志显示了对文件的操作。