git pre-commit钩子格式代码 - Intellij / Android Studio

时间:2015-08-29 15:29:31

标签: git android-studio intellij-idea format hook

这个要点展示了如何在预提交时使用Eclipse格式化程序自动格式化Java代码。

来源:https://gist.github.com/ktoso/708972

代码:

#!/bin/sh
#
# This hook will run the eclipse code formatter before any commit
# to make the source look as it's supposed to look like in the repo.

ECLIPSE_HOME=$HOME/eclipse
STYLE_FILE=$HOME/org.eclipse.jdt.core.prefs
echo "Running pre-commit hook: run-eclipse-formatter---------------------"
echo "Will run eclipse formatter, using: $STYLE_FILE"
echo "Listing folders to run formatter on… "
code_dirs=`find . -maxdepth 3 | grep 'src/'`
for dir in $code_dirs; do
   echo $dir;
done;

echo "Launching eclipse code formatter…    "
exec $ECLIPSE_HOME/eclipse \
                    -nosplash \
                    -application org.eclipse.jdt.core.JavaCodeFormatter \
                    -verbose \
                    -config $STYLE_FILE \
                    $code_dirs

echo "done---------------------------------------------------------------"

我想通过IntelliJ和Android Studio实现这一目标。那么剧本怎么样呢?

另外我想最好只在更改的文件上运行格式化程序。也许这很有用:

changedJavaFiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.java$')

ACM代表已添加,已复制,已修改。资料来源:http://git-scm.com/docs/git-diff

如果有任何不清楚的地方,请发表评论。

更新

我的设置是Windows 10,我想使用命令行工具MINGW32(Git Bash)。 Git版本是1.9.5 msysgit.1

3 个答案:

答案 0 :(得分:4)

IDEA将此内置到正常的提交对话框中。只需检查"重新格式化代码"这一切都将自动发生。

如果您想从命令行运行IDEA的重新格式化部分,我认为不可能。我发现可以在外面运行的唯一想法是代码检查。

答案 1 :(得分:4)

您可以使用自版本2016.3以来IntelliJ中提供的IntelliJ command-line source code formatter。例如(对于Git Bash):

CHANGED_JAVA_SRC_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '.java$')
$INTELLIJ_DIR/bin/format $CHANGED_JAVA_SRC_FILES

虽然Android Studio基于IntelliJ,但在IDE打开时似乎不支持此功能,请参阅下面的评论。

git-hooks-code-autoformat project in GitHub中提供了一个更高级的预提交钩子示例。

请注意,snap package可用于Ubuntu,因此很容易将其添加到Ubuntu Git或CI服务器。

答案 2 :(得分:2)

如果其他人需要Windows上的解决方案-我花了一半的时间工作,所以也许对某人有用:

ive create auto_reformat.bat,内容:

$items = [1, 2, 3, 4, 5];
$squared = array_map(function($x) { return $x ** 2; }, $items);
var_dump($squared); // [1, 4, 9, 16, 25]

以及此处报告的多个实例的问题:

https://youtrack.jetbrains.com/issue/IDEA-160462

解决方案:

https://confluence.jetbrains.com/display/IDEADEV/Command-Line+Source+Code+Formatter

但是它对我不起作用:(--无论如何,我们在许可证服务器上没有多余的许可证,希望能对某人有所帮助