sta*_*ith 14 git bash shell pull
我正在尝试编写一个执行以下操作的shell脚本:
通过我的研究,我发现了一些必要的命令来完成这些工作但我无法让它们在shell脚本中一起工作.
这是一个包含一些命令的脚本:
#!/bin/sh
#Check if there are any changed files
git --git-dir="/dir/.git" fetch origin
if git --git-dir="/dir/.git" log HEAD..origin/master --oneline
then
#Output the modified files from the last pull
git --git-dir="/dir/.git" diff --name-status ORIG_HEAD..
fi
Run Code Online (Sandbox Code Playgroud)
我无法使用此脚本中的命令的事情是:
如果我的脚本中的命令在这种情况下不能真正起作用,那么更好的方法是什么?
编辑:对不起应该更清楚我循环更改的文件,我需要从循环文件循环之前从远程存储库中提取更改,以便当我使用这些文件时,我有最新的更改.
Bri*_*ell 12
对于您的第一个问题,您可以使用git diff --quiet(或者git diff --exit-code,通常当您将其用于退出代码时,您希望它无论如何都不打印输出,并git diff --quiet暗示--exit-code)以确定是否有任何更改.如果有变化,那将给你1值,如果没有变化则给0.因此,如果您希望代码仅在有更改时运行:
if ! git --git-dir="/dir/.git" diff --quiet
then
# do stuff...
fi
Run Code Online (Sandbox Code Playgroud)
对于第二个问题,我建议使用while read ...循环来读取以下行git diff-tree:
git --git-dir="/dir/.git" diff-tree ORIG_HEAD.. | \
while read srcmode dstmode srcsha dstsha status srcfile dstfile
do
# do something with $srcfile and $dstfile
done
Run Code Online (Sandbox Code Playgroud)
请注意,开头$srcmode会有一个额外:的,$dstfile如果重命名文件,则只有一个值.如果您不想担心重命名,请传入--no-renames,而不是看到重命名,您只会看到添加和删除.
您可以简单地使用git diff --name-only列出已更改文件的所有文件名。
例如,这里有一个简单的脚本来列出所有已编辑的 PHP 文件并测试语法。
#!/bin/bash
files=`git diff --name-only | grep -E '.php$' `
for file in $files; do
php -l $file
done
Run Code Online (Sandbox Code Playgroud)