10

ローカル リポジトリが、コミット、スタッシュ、別のブランチへのチェックアウト、さらには変更の破棄を禁じている状態にあります。だから私は立ち往生しています。

私が覚えている限り、どのような手順でこの状況に至ったのかを説明しようと思います。

着席してください。

少し前、遠く離れた別のコンピューターで...別の開発者がプロ​​ジェクトのcrlfを正規化しました: https://help.github.com/articles/dealing-with-line-endings

しばらくの間 (ご存知のとおり、光の速さ...)、ローカルでいくつかの変更を行い、コミットし、プルしました。

私が引っ張ったとき、Gitは言った:

error: Your local changes to the following files would be overwritten by merge:
    wp-config.php

wp-config.phpgit update-index --assume-unchanged wp-config.php各ローカル環境に適応したテンプレート構成ファイルであるため、インデックスから以前に削除されました。

ベースの「テンプレート」は変更できます。驚くべきことは何もありません。ここで私が計画したもの:

  1. 再インデックスwp-config.php
  2. stash自分の設定変更
  3. pull origin master
  4. stash apply私の設定が戻ってきました

ステップ3で問題git pull origin masterが発生しました。スタッシュが無効であるかのように、上記のエラーが引き続き発生しました。

git statuswp-config.phpコミットのためにステージングされていない変更があったと述べました。隠した後、それは私を少し驚かせました。

変更を隠したので、実行しましたgit checkout -- wp-config.php...しかし、何の効果もありません! ファイルはまだコミット用にステージングされていません。

私は気が狂っていたので、新しいブランチ my-config を作成し、wp-config.phpそれに追加してコミットし、マスターに戻し、wp-config.php( を使用してgit rm) 削除し、origin/master をマージしました...成功しました!

マスターが最新でクリーンな状態になったので、Git の助けを借りずに (ファイルを手動で編集して) 自分の構成を復元することを計画しました。

何が起こったのか知りたかったので、my-config ブランチに切り替えて、ここで非常に簡単な操作を試みました。

git stash
git stash apply

そして、何を推測しますか?stash apply言って失敗しました:

error: Your local changes to the following files would be overwritten by merge:
    wordpress/license.txt
    wordpress/readme.html
    ...
    (all the files that where modified by the crlf conversion)

そして今、私は自分のブランチで立ち往生しています(そしてそれを見る予定です、フランス語圏の人は理解するでしょう;))以来:

  • git stash apply、上記のエラーが発生しcommitますcheckout master
  • git stashstash エントリを生成しますが、ステージングされていない状態は変更しません
  • git checkout -- <file>どちらもステージングされていない状態を削除しません

今できる唯一のことは、これらのファイルをすべて (OS を使用してrm) 削除して、マスター ブランチに戻れるようにすることです。

実話。

master ブランチで何が起こったのか、次に my-config ブランチで何が起こったのか、そして何がそのような状況になったのかを理解したいと思います (crlf 変換されたファイルで stash を使用していると思われます)。

重要事項:

  • Linuxで実行しています
  • git core.autocrlfオンですinput
  • my.gitattributesは「dealing-with-line-endings」の記事のものと同じです
  • 私はGitに比較的慣れていません(2日目です)

stashmy-config ブランチで実行すると、次のように出力されました。

warning: CRLF will be replaced by LF in wordpress/license.txt.
The file will have its original line endings in your working directory.
... (one for each crlf converted file) ...
Saved working directory and index state WIP on my-config: dbf65ad my config -- should not be pushed
HEAD is now at dbf65ad my config -- should not be pushed

( dbf65admy-config ブランチで行った唯一のコミットです)

4

3 に答える 3

5

いくつかの調査の後、次のことが起こったと思います。あなたの同僚は、最初のプル競合を引き起こした行末を変更しました。

だからこそ、あなたは自分の作品を隠しておき、(今では問題なく) 取り出して、再び隠し場所を適用し始めたのです。

git stash applygitを呼び出すと、隠した変更の再帰的なマージが開始されます。

エラー メッセージは、マージ競合が発生したことを示しているだけです。開発者のstash-documentationgit stash dropによると、これは競合を解決した後に解決される可能性があります。

「[スタッシュ] の適用は競合で失敗する可能性があります。この場合、スタッシュ リストから削除されません。手動で競合を解決し、git stash drop後で手動で呼び出す必要があります。」

結論:行末の構成を既存のプロジェクトで行う必要がある場合は.gitattributes、プロジェクト フォルダーで a を使用して行うのがベスト プラクティスのようです。line-ending-change-commit で配布されるため、現在の作業を新しい正規化標準に切り替えるという頭痛の種を回避できます。

プロジェクト内の行末の変更 & .gitattributes

開発者のドキュメントによる.gitattributesと、次の手順ですべてのファイル (アクティブなブランチ内) の行末を変更できます。

$ echo "<<filepattern>> eol=lf" >>.gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

<<filepattern>>ソースファイルに一致するパターンに置き換えます-python-filesの場合(この-description*.pyに適切なパターン説明があります)。.gitignore

追加するファイルパターンが複数ある場合は、いくつかの行末定義を.gitattributes.

注意: 2 番目のステップでは (ブランチ固有の) を削除する必要が.git/indexあるため、保持したいすべてのブランチでこれを行う必要があります。

処理するブランチが多数ある場合は、git ブランチを反復処理する短いスクリプトを作成することを検討してください。

于 2014-05-08T13:45:35.043 に答える
0

まず、GitHub ヘルプ ページに関しては、次の設定を真剣にお勧めします。

git config --global core.autocrlf false

グローバル マジック ルールの代わりに、.gitattributesファイル内の明示的な宣言に対する eol 変更を予約します: false のままにしますcore.autocrlf

git stash次に、 で同じ eol 変更を観察するかどうかを確認できますgit update-index --skip-worktree

于 2013-06-18T18:44:13.867 に答える