从Git Commits获取已删除的文件列表

时间:2015-07-06 09:11:15

标签: git git-commit

我正在开发PAAS应用程序。我们提供GIT部署功能,我们从临时目录中的Git仓库中提取代码,并将数据复制到服务器的工作公共目录。

这种方法的问题在于它不会直接删除Git Repo中删除的工作公共文件。我看到像DeployHQ这样的应用程序以某种方式从Git Commits中提取该列表。

我是否必须为此解析Git历史记录,或者是否有任何开源工具从Git提交历史记录中提取已删除/已修改文件的列表。

3 个答案:

答案 0 :(得分:2)

git log --diff-filter=D --summary

这样做。但是如果你删除了一个文件并创建一个同名的文件,它就不会列出。

答案 1 :(得分:2)

这不一定是Git问题,但更多的是如何复制文件的问题。如果您使用简单的cp命令,它将不会删除源文件夹中已删除的任何文件,它只会复制任何新的或更新的文件。您的目标目录仍将包含在源文件夹中删除的文件。

以下两种方法可以让它发挥作用:

选项1:重命名目标目录

您基本上将文件从Git仓库复制到新的空目录。然后删除以前的目标文件夹并将新文件夹重命名为公用文件夹:

cp -r git_repo/* temp
rm -rf public
mv temp public

这将允许您执行干净的休息,因为您使用mv命令切换目录。此时,新文件夹将变为活动状态。如果进程在旧文件夹中保持文件引用打开,则可能会遇到问题。

选项2:rsync

您可以使用cp之类的内容,而不是使用rsync命令,这样您就可以复制更改,还可以删除不再存在的文件。查看rsync手册页以获取更多信息和示例:http://linux.die.net/man/1/rsync

这是一个让你入门的例子:

rsync -avrKL --progress -d --delete-excluded --exclude=.git git_repo/ public/

rsync的一个优点是它非常有效 - 它不会复制任何未更改的文件。完成第一次运行后,它只会复制更改,新文件或删除已删除的文件,其他所有内容都将保留。

rsync的另一个好处是,您可以使用--exlude开关自定义复制的内容。以类似的方式,您可以使用带有通配符模式的--include开关。

要确保从目标文件夹中删除源文件夹中删除的文件,请确保在rsync命令行的源文件夹末尾使用斜杠。这将告诉rsync同步整个文件夹。

答案 2 :(得分:0)

您可能想尝试以下模式:

# Fetch the new content, but don't start using it yet
git fetch
# List the deletions between the current content and the incoming
git diff HEAD FETCH_HEAD --summary --diff-filter=D
# Update workspace to the new content
git merge FETCH_HEAD