4

序文

私は git を初めて使用し、プロジェクトで数か月間使用しており、Github で利用できるようにすることにしました。バックアップ スクリプトがほぼ正しく機能していることを発見したので、すべてをバックアップしましたが、ずさんです。ふぅ…でもプランBならいいのに。

問題

一部の netCDF データ ファイルが基本的にバージョン管理 (= 巨大なリポジトリ) で複製されていることに気付いたので、最初にこれらのファイル拡張子 (およびいくつかの test/data ディレクトリ) をルート ディレクトリ.gitのファイルに追加して、それらを除外しようとしていました。.gitignoreこれは、これらのファイルのバージョン管理を無視しているように見えますが、.gitリポジトリにはまだ含まれています。次に、それらを に追加しました.git/info/exclude。リポジトリから完全に無視されると思います。

発見するたびに、私は最初に

git pull [my_repo] master

次に

git push [my_repo] master

2 回目の反復の後 (.gitignore に何かを追加しただけだと思ったとき)、マージする必要のあるファイルに問題があるというエラーを受け取りました。.gitignore最初に gitHub を作成しましたが、これは別のものでした。これが問題であると想定し、マージを開始しました。

3回目の繰り返し(.git/info/excludeファイルに追加したもの)では、すべてうまくいきましたが、除外したいディレクトリだけがgitHubに存在することがわかりました。ディスクに戻ると、netCDF データ ファイルを含め、他のすべてがなくなっていました...

試してみましたがgit reset --hard master、リセットしてもすべて同じです。

誰でもこれに光を当てることができますか?可能な解決策?

同様の問題が見つからないようです。しかし、これを行ったのは私が最初ではないと思います。

4

3 に答える 3

5

編集: TL;DR バージョン:

git で無視したいファイルがレポ内にある場合:

  1. gitリポジトリからのみ削除します

    git rm --cached filesToIgnore

  2. ファイルまたはワイルドカード ルール (例: *.swp) をファイル内に配置し.gitignoreます。次に、リポジトリを保存しますgit commit

わかりました、すべてを完全につなぎ合わせたわけではありませんが、何がうまくいかなかったのかを分析してみましょう。

1位。.gitignoreと の間に違いはありませんが、前者はリポジトリにチェックインされ、無視するプロジェクト固有のファイル用であり、後者はvim 一時ファイルに関連する .git/info/excludeファイルなどの環境固有のファイル用です。.swp

そのことを念頭に置いて、ファイルをファイルに入れると、.git/info/exclude新しいファイルのみが無視され、リポジトリからすでに離れているファイルは無視されます(netCDFファイルがあったと思います)

2番目。では、git pull最初にリモート リポジトリに対して を実行git fetchし、次にリモート リポジトリとローカル リポジトリのマージを試みます。なぜこれが関連するのですか?ローカルにチェックされていないファイルがあると、文句を言うからです。これは、あなたが見たと私が推測するエラーです。

3番目。マージを強制したため、チェックインされていないファイルを破棄することになった可能性があります。これらはなくなりました。それらは git にチェックインされていないため、git はそれらについて知りません。

編集:ただし、cHao が指摘したように、git コミット内の以前のファイルはまだそこにあります。でリポジトリをgit log調べ、一時的にそれらのいずれかをチェックアウトしますgit checkout <checksumNumber>git reset --hard <checksumNumber>リポジトリをそのコミットに永久にリセットするために使用します。

4番目。正しいプロセスを無視したい git リポジトリにあるファイルを見つけた場合に行う必要があるのは、

git rm --cached filesToIgnore

git リポジトリからは削除されますが、作業ディレクトリからは削除されません。

次に、それらを .gitignore ファイルに追加し、変更をコミットすると、準備完了です。

于 2013-03-08T17:19:23.450 に答える
1

まず...あなたのものを取り戻すために。 master作業コピー、削除、およびすべてに表示されるようになりました。他の人がこのレポから引き出しているかどうかに応じて、元に戻すかリセットする必要があります。(そうでない場合は、どちらも機能します。ただし、リセットすると、よりクリーンな変更ログが得られます。)

他の人があなたのレポから悪いマージをプルした場合、私がこれを行っている方法は悪い考えです。しかし、あなただけがそれを使用している場合、または彼らがまだ気づいていない場合...

  • ファイルを削除または移動しexcludeます。ここで何かが明らかにおかしいので、対処する必要のある変数が少なければ少ないほど良いのです。
  • git log --summary. ファイルを削除したコミットを探します。この例で使用abcd1234します。)
  • git reset --hard abcd1234~1その直前のコミットに移動します。(SHA 全体を入れる必要はありません。あいまいさをなくすだけで十分です。)

あなたのものは今戻ってくるはずです。リポジトリを使用しているのはあなただけである場合はgit push --force origin master、古い (無効な) ヘッドを安全に上書きできます。

他の人がリポジトリからプルした場合、コミットを元に戻すことで問題が少なくなります。あなたが今行ったリセットを彼らにやってもらうことができ、それはうまくいくでしょう...しかし、誰が引っ張っているのかわからない場合は、Githubのデフォルトのケースです。:P

元に戻すには、git reset上記の代わりに、単に と言いgit revert abcd1234ます。これにより、そのコミットからの変更が取り消されます。ファイルが複数のコミットで何らかの形で削除された場合は、一度にすべてを指定して、1 つのコミットですべてを元に戻します。--forceいずれにせよ、ローカル ヘッドはオリジンの子孫であるため、 with はもう必要ありません。

このすべての原因については...既にレポにあるファイルが消えるだけではありません。 .gitignore既にリポジトリにあるファイルには影響しexcludeません。何かおかしなことが起こっており、完全な履歴がなければ、何が起こったのかを正確にまとめることはほぼ不可能です

于 2013-03-08T17:25:18.460 に答える