我有一个CENTRAL裸存储库,它通常有三个开发人员存储库对其进行拉和推。

我还有另外两个从CENTRAL裸回购提取的存储库:一个是活动服务器,另一个是测试/阶段服务器——每个从各自的分支提取。

场景是这样的:我在CENTRAL回购上有一个更新后的钩子脚本,它自动访问测试和活动回购,并在每个回购上运行一个pull命令。这将更新测试服务器和活动服务器,所有这些都取决于哪个分支有新的提交。这一切都很好。

问题在于:在紧急情况下,有时文件可能直接在服务器上更新(通过ftp或其他方式),CENTRAL后更新脚本将失败,因为将发生合并/覆盖冲突。没有办法避免这种情况,这是不可避免的。

我想发生的是这样的:我希望来自现场和测试站点的拉总是覆盖/合并拉。总是这样。这些回购将是拉回购,因为它们不是为了发展。

在我所有的研究中,我找不到一个好的解决方案,让一个pull总是强制覆盖本地文件。这有可能吗?如果是这样的话,这将是一个伟大的发展场景。


当前回答

你可以换钩子把所有东西都擦干净。

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...

其他回答

你可以试试这个:

git reset --hard HEAD
git pull

(从我如何强制“git拉”覆盖本地文件?)

另一个想法是删除整个git并创建一个新的克隆。

git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch

真正理想的方法是完全不使用pull,而是fetch和reset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

(将master更改为您想要遵循的任何分支。)

Pull是围绕以某种方式将更改合并在一起而设计的,而reset是围绕简单地使本地副本与特定提交匹配而设计的。

您可能需要根据系统的需要考虑稍微不同的清理选项。

如果你在上一次拉/克隆之后还没有提交本地更改,你可以使用:

git checkout *
git pull

签出将在最后一次本地提交时清除您的本地更改 Pull将把它归为远程存储库

我不确定如何在一个命令中做到这一点,但你可以这样做:

git reset --hard
git pull

甚至

git stash
git pull