如果工作目录不干净(如无视冲突检查),如何强制Git中止结账?

时间:2014-03-24 12:35:55

标签: git git-checkout

当您执行git checkout some_branch并且您的工作目录不干净时,Git将检查结帐是否会导致任何冲突,如果是,它将中止:

$ git checkout some_branch
error: Your local changes to the following files would be overwritten by checkout:
        some_file
Please, commit your changes or stash them before you can switch branches.
Aborting

但是,如果结帐不会导致任何冲突,那么Git将切换到该新分支并继承所有未提交的更改(并列出它们,礼貌为Git)。

$ git checkout some_branch
M       some_file
M       some_other_file
Switched to branch 'some_branch'

到目前为止一直很好......

现在,并非所有Git用户都使用cmd行。如果您使用IDE(例如Eclipse)并使用脏工作目录检查some_branch并且不会导致任何冲突,那么您将不会很好地通知您在{{更改为previous_branch后,1}}仍存在于您的工作目录中。

即。当您编译代码时,some_branch上的未提交更改仍会出现在previous_branch上的工作目录中。

问题#1:

如果工作目录不干净(无论是否有任何冲突),是否可以强制Git中止结账?

我更喜欢全局Git配置中的设置。

问题#2:

如果无法设置,那么它是否是Git中新配置选项的有效请求?

正如我所看到的那样Git在上下文切换方面非常强大(即在多个分支上处理多个问题),我可以看到一个用于设置严格检查工作目录是否干净的设置(忽略检查)对于冲突)。

这意味着在更改为分支#2时,在分支#1上创建的更改将不会被转移,即您将始终严格遵循上下文。

对此有何看法或意见?

4 个答案:

答案 0 :(得分:2)

我不知道这样的选项,但这是一个模拟这个的脚本 行为。也许IDE(或OS)可以配置为运行此脚本 git-checkout

#!/bin/sh

MODIFIED=$(git status -s | grep ^\ M)

if [ "$MODIFIED" != "" ]; then
  echo "Current branch is dirty!"
  exit 1
else
  git checkout $1
fi

您可以将此脚本命名为git-cleancheckout,将其放入$ PATH并运行 像这样

git cleancheckout mybranch

答案 1 :(得分:0)

应该选择&#34;重置&#34;以前的变化。它在命令行上由--force描述。我使用gitEx,这在checkout <branch>时可用,如下所示 -

enter image description here

这将在签出分支之前自动删除所有本地更改。如果您想要在商店中保留更改并在想要在旧分支上再次开始工作时将其取回,则可以使用图像中的选项(藏匿)。

答案 2 :(得分:0)

您应该可以使用结帐后挂钩来完成您所需的几乎所有操作。 限制是没有预签结挂钩,所以你不能中止。 相反,您只能放弃本地更改才能获得干净状态。 如果您愿意,可以使用git stash save X保存本地更改 并在删除之前创建任何未跟踪文件的存档。

您表示您更喜欢全局git配置中的设置; 如previously suggested elsewhere on SO, 使用git 1.7.1或更高版本,您可以使用以下内容:

git config --global init.templatedir '~/.git-template'

使用模板化挂钩创建所有存储库(通过git initgit clone)。 模板化钩子是指向存储库本身的符号链接, 因此,当您创建其他(不相关的)存储库时,它们不会产生任何影响:

mkdir -p ~/.git-template/hooks && \
  ln -sf ../../special-git-hooks/post-checkout ~/.git-template/hooks/.

special-git-hooks/post-checkout脚本是将要实现的脚本 道德等同于git checkout --force

#!/bin/sh
#
# git hook to clean branch checkout (git checkout --force plus more)
#

# arguments to post-checkout (see `man githooks`)
OLD_REV=$1
NEW_REV=$2
BRANCH=$3

if [ 0 = "$BRANCH" -o x"$OLD_REV" = x"$NEW_REV"]; then
    exit 0
fi

# Start from the repository root.
cd ./$(git rev-parse --show-cdup)

ARCHIVE=`mktemp -qu gitco-XXXXXXXXX`

git clean -nxd | sed 's/Would remove //' | cpio -oz --format ustar > $ARCHIVE.tgz
git add -f $ARCHIVE.tgz
git clean -fxd
git stash save $ARCHIVE

请注意,此脚本不处理带换行符的文件 或其名称中的其他非打印字符。 我正在研究这个脚本的Perl版本。

答案 3 :(得分:0)

在命令行中,如果发现忘记了某些内容,只需检查上一个分支。 在EGit中,更改在暂存视图中可见,但遗憾的是,这些更改始终不可见。

Git中的一个新选项并没有自动进入Eclipse,而是显示了一个列表 结帐后修改的文件似乎是对EGit的可重用功能请求。