1

TLDR

作業コピーの内容を実際に .git サブフォルダーのリポジトリにあるものにする git コマンドは何ですか? (変更が別のマシンから作業コピーを持つリモート リポジトリにプッシュされた場合)

長い話

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'

ここで説明されている

Git で receive.denyCurrentBranch を使用すると、どのような影響がありますか?

それで、私は設定しました

git config receive.denyCurrentBranch ignore

もう一度試してみると、 git push が機能しました。しかし、今回はリモートリポジトリに戻り、動作しますが、git status を実行しようとすると何か違うことを訴えます

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 フォルダー内の実際のリポジトリのインデックスで作業リポジトリの内容を強制的に上書きする方法を理解する必要があります。

今、私はこれを見つけました

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
#

では、実際にリポジトリにあるものの内容を作業コピーに反映させるにはどうすればよいでしょうか?

4

2 に答える 2

3

git checkout -fリポジトリ内のすべてのファイルの最新バージョンを取得します。git clean -fルートでバージョン管理されていないすべてgit clean -f -xのファイルを削除し、明示的に無視されたファイル (.gitignoreファイル内) も削除します。

于 2013-03-20T01:49:41.063 に答える
0

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

git reset --hard REFSPEC

于 2013-03-20T08:55:36.203 に答える