在我需要拉取的几个提交中,有一些删除。这些文件属于一些基本项目文件,这些文件不应该出现在 git 存储库中(这首先是我们的错误,是的)。 所以我担心删除该文件可能会导致一些故障,我不想花时间修复它。
我正在寻找类似的东西
git rm --cached
从远程存储库中删除文件,但保留在本地
我需要类似的东西
git pull --cached
这不会删除本地文件,但会将它们从跟踪文件中删除
没有简单的方法可以做到这一点 -
git pull
无论如何都会删除已删除的文件。您可以从以前的提交中恢复已删除的文件。提供删除文件的提交是分支中的最后一次提交:
git pull
git checkout @~ -- `git diff --diff-filter=D --name-only @~`
git reset -- `git diff --diff-filter=D --name-only @~`
这将从最后一次提交之前恢复已删除的文件。需要
git reset
从索引(缓存)中删除文件:git checkout
将它们放在那里。
我收到了@phd 关于如何执行此操作的答案的更新。我想我会分享,因为我花了几个小时进行故障排除才能完成我想要完成的任务,这可能对遇到此问题的其他人有所帮助。
我遇到过这样的情况:我需要从远程存储库中删除大量以前跟踪的文件,但希望将这些文件保留在本地,以便任何已经检查过跟踪这些文件的存储库版本的开发人员。更糟糕的是,这些文件位于多个目录、子目录和根目录中的一些单独文件中。 主要问题是删除文件的提交是
不是对存储库所做的最后一次提交。这是一些提交回来的。 此解决方案允许您使用任何提交来执行相同的操作,因此您不仅限于最后一次提交。这个答案结合了一些博客文章和其他 Stackoverflow 答案
从分支的最新版本中拉取(例如
git pull origin master
commit_hash_right_before_files_were_deleted
)
git log --diff-filter D --pretty="oneline" --name-only --format= -l 0 commit_hash_right_before_files_were_deleted..commit_hash_where_where_files_were_deleted
)
sed
命令以删除空行(例如
sed '/^$/d'
从此处获取:https://waylonwalker.com/git-find-deleted-files/#git-reflog-diff-filter )
sed '/^$/d' | zip deleted-files.zip -@ foo
。
sed
命令从输出中删除空白的空行。从这里获取https://superuser.com /a/1228717/1247351)
git checkout master
)
unzip deleted-files.zip
)
git pull origin master
git checkout commit_hash_right_before_files_were_deleted
git log --diff-filter D --pretty="oneline" --name-only --format= -l 0 commit_hash_right_before_files_were_deleted..commit_hash_where_files_were_deleted | sed '/^$/d' | zip deleted-files.zip -@
git checkout master
unzip deleted-files.zip
git reset -- `git diff --diff-filter=D --name-only commit_hash_where_files_were_deleted`
我们传递给 git log
命令一些额外的参数。我们传递
-l 0
参数以避免 git log 截断返回的已更改文件列表。我们还传递
--format=
参数来防止 git log 输出提交哈希和提交消息;我们只关心更改的文件列表。尝试了一些解决方案,包括尝试使用
git update-index --assume-unchanged
命令,但是当我尝试从远程分支拉取时,它只会继续删除文件。这是满足我需求的最佳解决方案。