我正在开发PAAS应用程序。我们提供GIT部署功能,我们从临时目录中的Git仓库中提取代码,并将数据复制到服务器的工作公共目录。
这种方法的问题在于它不会直接删除Git Repo中删除的工作公共文件。我看到像DeployHQ这样的应用程序以某种方式从Git Commits中提取该列表。
我是否必须为此解析Git历史记录,或者是否有任何开源工具从Git提交历史记录中提取已删除/已修改文件的列表。
答案 0 :(得分:2)
git log --diff-filter=D --summary
这样做。但是如果你删除了一个文件并创建一个同名的文件,它就不会列出。
答案 1 :(得分:2)
这不一定是Git问题,但更多的是如何复制文件的问题。如果您使用简单的cp
命令,它将不会删除源文件夹中已删除的任何文件,它只会复制任何新的或更新的文件。您的目标目录仍将包含在源文件夹中删除的文件。
以下两种方法可以让它发挥作用:
您基本上将文件从Git仓库复制到新的空目录。然后删除以前的目标文件夹并将新文件夹重命名为公用文件夹:
cp -r git_repo/* temp
rm -rf public
mv temp public
这将允许您执行干净的休息,因为您使用mv
命令切换目录。此时,新文件夹将变为活动状态。如果进程在旧文件夹中保持文件引用打开,则可能会遇到问题。
您可以使用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