Replace working copy of git repo with actual contents of repo in .git?

こ雲淡風輕ζ 提交于 2019-12-11 04:28:40

问题


TLDR

What is the git command to force the contents of the working copy to be what's actually in the repo in the .git subfolder? (In the event that changes are pushed from another machine to a remote repo that has a working copy)

LONG STORY

I would like my team within my company, which uses perforce, to move to git. I want to use Git-P4 to achieve that. I want to have a section of perforce cloned to a git repo, and make that a remote repo, so that people would clone that, push changes to the remote repo and I would periodically resubmit the changes made in the remote repo back to the perforce. So I followed this tutorial

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

which boiled down to this command:

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

That works, then on my client machine I do

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

and that's fine and it shows up so I make an edit to a test file, then do the

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

When I try to push it back to the remote repo, I get this error on the client

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'

which is explained here

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

so then I set

git config receive.denyCurrentBranch ignore

and tried it again and git push worked. But back at the remote repo this time, it works but it complains about something different when I try to do a git status

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

It's telling me this because the working copy in the remote repo is not the same as what's just been pushed to the remote repo. git p4 submit and git p4 rebase work they also complain about these uncommitted changes

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.

This seems like something that will become a big problem over time. I don't want to leave the working copy on the remote repo in that state permanently.

So I have to figure out how to forcefully overwrite the contents of the working repo with the actual repository's index in the .git folder.

Now I found this

How do I discard unstaged changes in Git?

Which said to do this

git stash save --keep-index
git stash drop

or do this

git checkout -- .

and neither one of those worked. They looked like they worked, but the added file was still not there and git status still showed the unstaged change caused by the difference between the working copy and the index.

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
#

So how do I force the working copy to represent the contents of the what's actually in the repo?


回答1:


git checkout -f gets the last version of all files in the repository. git clean -f in the root deletes all files that aren't under version control, git clean -f -x also deletes the files that are explicitly ignored (in .gitignore files).




回答2:


You can set your head to any state with the command:

git reset --hard REFSPEC



来源:https://stackoverflow.com/questions/15512700/replace-working-copy-of-git-repo-with-actual-contents-of-repo-in-git

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!