简体   繁体   English

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

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

TLDR 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? 什么是git命令,可将工作副本的内容强制为.git子文件夹中的存储库中的实际内容? (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. 我希望我公司中使用perforce的团队迁移到git。 I want to use Git-P4 to achieve that. 我想使用Git-P4来实现。 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. 我想将一段perforce克隆到一个git仓库中,并使其成为一个远程仓库,以便人们克隆它,将更改推送到远程仓库中,然后我会定期将在远程仓库中所做的更改重新提交给perforce。 。 So I followed this tutorial 所以我按照本教程

http://answers.perforce.com/articles/KB_Article/Git-P4 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? 在Git中使用receive.denyCurrentBranch有什么后果?

so then I set 所以我开始

git config receive.denyCurrentBranch ignore

and tried it again and git push worked. 然后再试一次,git push起作用了。 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时,它抱怨有些不同

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提交和git p4变基工作,他们还抱怨这些未提交的更改

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. 因此,我必须弄清楚如何用.git文件夹中实际存储库的索引强制覆盖工作库的内容。

Now I found this 现在我发现了

How do I discard unstaged changes in Git? 如何丢弃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 status仍然显示由于工作副本和索引之间的差异而导致的未暂存更改。

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? 那么,如何强制工作副本代表回购中实际内容呢?

git checkout -f gets the last version of all files in the repository. git checkout -f获取存储库中所有文件的最新版本。 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). 根目录中的git clean -f删除所有不受版本控制的文件, git clean -f -x还将删除被显式忽略的文件(在.gitignore文件中)。

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

git reset --hard REFSPEC

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM