我正在开发一个PAAS应用程序。我们提供了GIT部署功能,我们从临时目录中的Git存储库中提取代码,并将数据复制到服务器的工作公共目录中。
这种方法的问题是,它不会直接从工作公共中删除在Git Repo中删除的文件。我看到像DeployHQ这样的应用程序以某种方式从Git Commits中提取了这个列表。
我是否必须解析Git历史记录,或者是否有任何开源工具可以从Git提交历史记录中提取已删除/修改的文件列表。
发布于 2015-07-06 17:14:27
git log --diff-filter=D --summary这个就行了。但是如果你删除了一个文件并创建了一个同名的文件,它将不会被列出。
发布于 2015-07-06 17:19:12
这不一定是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同步整个文件夹。
发布于 2015-07-06 18:36:28
您可能希望尝试以下模式:
# 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_HEADhttps://stackoverflow.com/questions/31241850
复制相似问题