将git repo的工作副本替换为.git中repo的实际内容?

时间:2013-03-19 23:49:01

标签: git perforce git-p4

TLDR

什么是强制工作副本内容的git命令是.git子文件夹中repo中的实际内容? (如果将更改从另一台计算机推送到具有工作副本的远程仓库)

LONG STORY

我希望我公司的团队使用perforce,转移到git。我想用Git-P4实现这一目标。我想将一部分perforce克隆到一个git仓库,并将其作为一个远程仓库,以便人们克隆它,将更改推送到远程仓库,我会定期将远程仓库中所做的更改重新提交给perforce 。所以我按照本教程

http://answers.perforce.com/articles/KB_Article/Git-P4

归结为这个命令:

git p4 clone //depot/path.to/folder@all folder

那可行,然后在我的客户端机器上

git clone "user1@server:/home/user1/path/to/folder"

,这很好,它显示出来,所以我编辑了一个测试文件,然后执行

git add test7
git commit -m 'test'
git push

当我尝试将其推回远程仓库时,我在客户端上收到此错误

git push
user1@server1's password: 
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes, done.
Total 3 (delta 1), reused 1 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To user1@server1:/home/user1/path/to/folder
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'user1@server1:/home/user1/path/to/folder'

这里解释

What are the consequences of using receive.denyCurrentBranch in Git?

然后我设置

git config receive.denyCurrentBranch ignore

再次尝试,git push工作。但是这次回到远程仓库,它可以工作,但当我尝试做一个git状态时,它会抱怨一些不同的东西

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test7
#

它告诉我这个,因为远程仓库中的工作副本与刚推送到远程仓库的副本不同。 git p4 submit和git p4 rebase work他们也抱怨这些未提交的更改

git p4 submit
Perforce checkout for depot path //depot/path.to/folder/ located at /home/user1/path/to/perforce.folder/
Synchronizing p4 checkout...
... - file(s) up-to-date.
Applying 38f67b9 cym: test 7 from linux
//depot/path.to/folder/test7#1 - opened for add
//depot/path.to/folder/test7#1 - nothing changed
Submit template unchanged. Submit anyway? [y]es, [n]o (skip this patch) y
Change 254654 created with 1 open file(s).
Submitting change 254654.
Locking 1 files ...
add //depot/path.to/folder/test7#1
Change 254654 submitted.
All commits applied!
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/path.to/folder/automation/
Import destination: refs/remotes/p4/master
Importing revision 254654 (100%)
You have uncommited changes. Please commit them before rebasing or stash them away with git stash.

git p4 rebase
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/path.to/folder/
No changes to import!
You have uncommited changes. Please commit them before rebasing or stash them away with git stash.

随着时间的推移,这似乎会成为一个大问题。我不想永久地将工作副本留在该状态的远程仓库中。

所以我必须弄清楚如何使用.git文件夹中的实际存储库索引强制覆盖工作存储库的内容。

现在我找到了这个

How do I discard unstaged changes in Git?

据说这样做

git stash save --keep-index
git stash drop

或者这样做

git checkout -- .

并且其中任何一个都没有。他们看起来像是工作了,但添加的文件仍然不存在,git状态仍然显示由工作副本和索引之间的差异导致的未分级更改。

git stash save --keep-index
Saved working directory and index state WIP on master: 38f67b9 cym: test 7 from linux
HEAD is now at 38f67b9 cym: test 7 from linux
git stash drop
Dropped refs/stash@{0} (3ce5805230e4faa3ec4dd2daa9cb65c86335e1a8)
git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test7
#

git checkout -- .

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    test7
#

那么如何强制工作副本来代表回购中实际内容?

2 个答案:

答案 0 :(得分:2)

git checkout -f获取存储库中所有文件的最新版本。根目录中的git clean -f删除所有不受版本控制的文件,git clean -f -x还会删除明确忽略的文件(在.gitignore文件中)。

答案 1 :(得分:0)

您可以使用以下命令将头部设置为任何状态:

git reset --hard REFSPEC

相关问题