【问题标题】:Local git repo force updated from a remote git repo. (thick-client deployments)本地 git repo 强制从远程 git repo 更新。 (厚客户端部署)
【发布时间】:2011-01-18 10:47:51
【问题描述】:

更新:我认为这与 windows git 客户端 msysgit 的问题有关。很抱歉给大家添麻烦了。 http://code.google.com/p/msysgit/issues/detail?id=379&colspec=ID%20Type%20Status%20Priority%20Component%20Owner%20Summary

我正在寻找一种方法来使多个客户端框与远程 git 存储库保持同步。强制从远程存储库进行更新并放弃客户端框上可能已更改的任何内容。

我遇到的问题是客户端框会修改一些文件(安装日志等),并在我需要从远程存储库更新它们时给我一个合并噩梦。我尝试了几个命令来尝试重置它们的本地更改(应该放弃本地更改),但似乎没有一个像宣传的那样工作(git reset --hard)。

我不想克隆然后删除这些框上的 .git 目录,因为我希望它们只更新更改而不是每次都拉下整个 repo。

有什么想法吗?

【问题讨论】:

  • 您是说 git reset --hard 不会将您的本地树恢复到最新版本 (HEAD)?
  • 客户端是否修改了文件的权限及其内容?如果是这样,“git reset”可能不会覆盖它们,具体取决于您运行的平台。
  • 是的,在运行 git reset --hard 后,我仍然看到一堆修改过的文件(通过 git status)。这些客户端机器是 windows 盒子,我正在使用 msysgit(最新)。
  • @Dave:我看到你(可能)找到了问题,这是一个 msysgit 错误。我建议你在 Cygwin 下使用 Git 代替?如今,它实际上在大多数操作中运行得相当快,并且是在 Windows 上运行 Git 的“官方”方式。不言而喻,这个 bug 在 Cygwin 的 Git 中不存在。
  • @Dan:我很少使用 Windows 机器,这只是这个特定项目的要求,所以我选择了一个快速的解决方案,让我们的测试客户及时了解我们的变化.我不确定这是一个 msysgit 问题,但似乎更像是一个 git + windows 时间戳问题。我会尝试使用 cygwin 或 rsync 解决方案。啊窗户,每次我碰到它,它都会提醒我为什么我一开始就避开它。

标签: git merge copy repository clone


【解决方案1】:

据记录,这个原始问题似乎仅限于 msysgit 1.6.5.1 (issue 379),正如 OP 所述。

但是,同样的问题在 2012 年提到了与其他原因类似的问题:

郑重声明,我有这个 autocrlf = false 的问题。

执行git reset --hard 仍然会留下与文件权限相关的未提交更改:

$ git reset --hard
HEAD is now at 088c702 BranchA

$ git diff

diff --git a/path/to/file b/path/to/file
old mode 100755
new mode 100644
...

这与“Removing files saying “old mode 100755 new mode 100644” from unstaged changes in git”有关

我发现出于某种原因,core.filemode 在存储库级别设置为 true(我自己没有设置):

$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true

所以:推荐git config core.filemode false

【讨论】:

    【解决方案2】:

    很奇怪,git reset --hard 应该删除本地存储库中所做的任何更改。

    您可以尝试git stash && git pull,它只是将更改移动到某种临时分支中(git stash clear 删除任何更改痕迹)

    如果这不起作用,你可以试试这个(假设你在 master 分支上并且 tmp 分支不存在)

    git checkout origin/master -b tmp
    git branch -D master
    git branch -m master
    

    【讨论】:

    • 我已经尝试过存储,但没有工作。我知道这听起来很奇怪,但我已经使用 git 一段时间了,现在才遇到这个问题。分支听起来应该可行,我会试一试。
    【解决方案3】:

    我假设您有充分的理由为此使用 Git,而不是 rsync。

    这就是我的做法(在客户端上):

    git fetch origin
    git reset --hard origin/master
    git clean -dfx
    

    请注意,您需要重置为 origin/master 而不是 HEAD,因为本地 HEAD 不包括源的最新提交(目前)。

    【讨论】:

    • 还是不行。我想一定是git客户端的问题。
    【解决方案4】:

    以下两个命令应将客户端的工作树重置为干净状态,即与前面的git clone 相同:

    git reset --hard HEAD
    

    这将撤消对被跟踪文件(即存在于 repo 中的文件)所做的任何修改。

    git clean -fdx
    

    这将删除客户端新创建的所有文件,即未被 git 跟踪的文件。

    【讨论】:

    • 不幸的是,在运行这两个命令之后,我仍然看到几个 modified 尚未提交的文件...我的客户端机器是 windows 框,所以也许这是一个问题使用 msysgit 客户端。
    【解决方案5】:

    听起来您正在寻找 rsync,而不是 git。您能否再解释一下为什么要使用完整的修订控制系统来“仅仅”保持某些文件同步?

    【讨论】:

    • 可能我没有解释清楚。并不是我只想同步某些文件,而是我希望同步仅是单向的。主从。
    • @Dave:Gerco 的建议听起来不错——rsync 可用于单向同步。但是,AFAIK 不会删除在客户端上新创建但在主副本中不存在的文件。为此,git 为您提供“git clean -fdx”。
    • @gareth: rsync 有--delete 选项来删除目标中存在的文件,而不是源中的文件。我认为,除非他出于某种原因需要 Git,否则 rsync 可以正常工作。
    猜你喜欢
    • 2021-07-03
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2020-02-16
    相关资源
    最近更新 更多