2010-02-18 94 views
2

更新:我认为这与windows git客户端msysgit有关。对不起,麻烦你们。 http://code.google.com/p/msysgit/issues/detail?id=379&colspec=ID%20Type%20Status%20Priority%20Component%20Owner%20Summary从远程git仓库更新本地git repo force。 (厚客户端部署)

我正在寻找一种方法来保持几个客户端与远程git仓库同步。从远程回购强制更新并放弃客户端可能已更改的任何内容。

我遇到的问题是,客户端将修改一些文件(安装日志等),并给我一个合并噩梦,当我需要从远程回购更新它们。我尝试了几个命令来尝试重置其本地更改(应该放弃本地更改),但似乎没有一个可以像广告一样工作(git reset --hard)。

我不想做一个克隆,然后删除这些盒子上的.git目录,因为我更喜欢它们只更新更改,而不是每次都下拉整个回购。

任何想法?

+0

你在说'git reset --hard'不会将你的本地树恢复到最新版本('HEAD')? – ezod 2010-02-18 17:49:13

+0

客户端是否修改文件的权限及其内容?如果是这样,'git reset'可能不会覆盖它们,具体取决于您运行的平台。 – 2010-02-18 17:54:48

+0

是的,我仍然看到一堆修改后的文件(通过git状态)后运行git reset --hard。这些客户端机器是Windows的盒子,我使用msysgit(最新)。 – 2010-02-18 18:00:35

回答

1

这听起来像你正在寻找rsync,而不是混帐。你能否解释一下为什么你想使用完整版本的控制系统来“仅仅”保持一些文件同步?

+0

也许我没有解释清楚。这并不是说我只想同步某些文件,而是希望同步只能是单向的。主人和奴隶。 – 2010-02-18 17:50:22

+0

@Dave:Gerco的建议听起来很不错 - rsync可用于单向同步。但是,AFAIK不会删除在客户端上新创建但在主副本中不存在的文件。为此,git给你'git clean -fdx'。 – 2010-02-18 17:52:40

+0

@gareth:rsync具有'--delete'选项来删除目标中存在的文件,但不是源文件。我认为,除非他*需要* Git由于某些原因没有指定,rsync会工作得很好。 – 2010-02-18 18:01:06

1

以下两个命令都应该在客户端的工作树恢复到一个干净的状态,即等同于它是如何执行上述git clone

git reset --hard HEAD 

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

git clean -fdx 

这将删除已经由客户端,即未通过git的跟踪被新创建的任何文件。

+0

不幸的是,在运行这两个命令后,我仍然看到几个*修改的*还没有提交的文件...我的客户端机器是windows盒子,所以也许这是msysgit客户端的问题。 – 2010-02-18 17:57:49

5

我假设你有一个很好的理由为此使用Git,而不是rsync。

这是我会做它(对客户):

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

请注意,您需要重置为origin/master,而不是HEAD因为当地HEAD不包含原点的最新提交(但)。

+0

还是不行。我认为这一定是git客户端的问题。 – 2010-02-18 18:05:47

1

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

你可以尝试git stash && git pull,它只是移动的变化在某种temporay分公司(git stash clear去除的变化的任何痕迹)

如果不工作,你可以试试这个(假设你是在主分支,该分支TMP不存在)

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

我已经试过藏了,没有工作。我知道这听起来很奇怪,但我一直在使用git,现在只是遇到了这个问题。分支它听起来应该工作,我会给它一个旋转。 – 2010-02-18 18:02:48

0

为了记录在案,这种原始的问题似乎仅限于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

我发现,由于某些原因,核心。 filemode在存储库级别设置为true(我没有自己设置):

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

所以:建议使用git config core.filemode false