拉取时忽略的GIT文件被删除了。

3
我有一个git仓库,其中有一个目录存放着用户上传的文件。该目录还包含一个.gitignore文件,文件内容为*/
我从远程仓库进行了一次pull操作,然后发现该目录中的所有文件都被删除了,而且没有任何警告提示。 这是什么原因造成的? 我所做的所有研究都告诉我这是一个故意删除所有文件的行为,不可能是无意中发生的。这是否属实,或者有其他git命令可以悄悄地删除所有这些文件?

可能是有人在提交时从仓库中删除了它们。 - Lily Ballard
它们是被忽略的文件,因为它们不在远程代码库中。 - nathanjosiah
你确定拉取操作是删除那些文件的原因吗? - Greg Hewgill
还有哪些简单操作可以毫无警告地完成这个任务? - nathanjosiah
@nathanjosiah:你确定它们以前没有被跟踪吗?如果已经在仓库中,将其放入“.gitignore”中并不会使其被忽略。 - Lily Ballard
目录中的文件是用户上传的。 - nathanjosiah
1个回答

2

.gitignore是一种方便的工具,可以防止噪音出现在状态报告中或被自动添加到git add .等命令中。您可以明确地添加一个被忽略的文件,然后git将会关心这个特定的文件,而在.gitignore文件中命名一个文件并不会让git停止关心已经被跟踪的文件。

如果git pull删除了文件,则这些文件是被跟踪的并被删除了。您可以通过git checkout "@ {may 21 17:30 pdt}"或类似于此的引用来获取它们,以便于您检查出的提交与拉取操作一致。

虽然很少见,但有可能有人添加了文件,没有提交更改,并强制合并,这样会使孤立的文件更难找到,但除非有人明确地擦除了git的记忆,否则git fsck --lost-found就像旧的undelete程序一样,它会将你曾经关心但却被丢弃的所有东西复制到.git/lost-found中。

git ls-files -ic --exclude-standard将显示与忽略规范匹配的被跟踪的文件,即某些人可能会因错误添加或忽略文件。想一想,这可能不是一个坏的预提交钩子。

git ls-files -ic --exclude-standard \
| sed '${p;s,.*,*** '"$0"' refusing commit with tracked files marked as ignored in the standard excludes lists,;q1}'

1
没有任何文件被跟踪,因为它们都是用户上传的。在存储库的任何提交中都没有它们的副本,而且目录 .git/lost-found 也不存在。 - nathanjosiah
1
然后 git pull 没有删除它们。 - jthill
哪个指令可以删除它们?我正在努力弄清楚这一点,因为我刚刚接管了这个没有正确设置的服务器。我试图从远程代码库拉取更改到服务器时,之后所有用户上传的内容都不见了。 - nathanjosiah
1
git clean 会删除被忽略的文件。检查 .git/hooks 目录下不符合命名规则 *.sample 的可执行文件,可能有人在其中“玩得太溜”了。运行 git fsck --lost-found 命令来创建并填充 .git/lost-found 目录,再次查看以确认。 - jthill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接