17

基本的なgitの概念を理解するのに苦労しています:/

Git で制御されたサイトでいくつかのことを試す前に、ローカルの Windows マシンでテストしています。

私は持っている:

gittesting/repo1:
    file.txt
    ignoreme:
        ignore.txt

gittesting/repo2
    file.txt
    ignoreme:
        ignore.txt

Repo2 は repo1 のコピーであり、ignoreme は既に追跡されています。ignore.txt ファイルは repo2 で変更されますが、追跡を停止し、git が完全に無視するようにしたいと考えています。問題は、.gitignore ファイルを作成して ignoreme を追加すると、既に追跡されているため手遅れになることです。そのため、git rm --cached ignore を実行する必要がありますが、削除済みとしてマークされ、コミットをプルした場合repo1、ディレクトリはそのままではなく削除されます..

要約すると:

  1. ignore.txt の内容は、2 つのリポジトリ間で異なります。
  2. ignore.txt の内容をそのままにして、git によって完全に無視されるようにしたい

オンラインで調べたり、IRC で質問したり、非常に関連する質問を見たりしましたが、これを行う方法が見つかりません。この例は些細なことのように思えますが、ディレクトリが代わりに Forum/cache である私のサイトで行う必要があることはまさにそれです。


編集:

これはちょっとしたハックであり、より良い答えを望んでいますが、最終的には次のようになりました。

cd repo2
echo "ignoreme" > .gitignore
echo "ignoreme/*" > .gitignore
git rm --cache -r ignoreme
git commit -m "Should ignore now"
cd ../repo1
mv ignoreme ignoreme2
git pull ../repo2
mv ignoreme2 ignoreme
4

5 に答える 5

20

これを試して

git update-index --assume-unchanged ignoreme/ignore.txt

Gitは、リポジトリを変更せずに、このファイルへの今後の変更を無視します。変更の追跡を再開するには、

git update-index --no-assume-unchanged ignoreme/ignore.txt

これは現在の作業コピーに対してのみ有効であるため、リポジトリのクローンを作成するたびにこれを行う必要があることに注意してください。

于 2012-05-18T05:18:55.343 に答える
7

私があなたの質問を正しく理解していれば、あなたはディレクトリrepo2について知りたいと思ってignoreme/いますが、ディレクトリへの変更を Git に気にさせたくないでしょう。今後、このコンテンツの追跡git rm --cachedを停止するように Git に指示しているため、役に立ちません。

コンテンツを追跡するための Git のソリューションは、特定の時点で修正されますが、サブモジュールを使用します。これはGit Bookを除いて説明しています (強調を追加):

rack作業ディレクトリのサブディレクトリですが、Git はそれをサブモジュールと見なし、そのディレクトリにいない場合はその内容を追跡しません。代わりに、 Git はそれをそのリポジトリからの特定のコミットとして記録します。

次のことを試すことができます。

  1. ディレクトリを新しい場所にコピーし、ignoreme/それを git リポジトリにします

  2. にサブモジュールとして追加し直しますrepo2

    git submodule add file:///path/to/ignoreme ignoreme
    git commit -m"Add ignoreme/ as a submodule"
    

サブモジュールが特定のignoremeコミットに固定されるようになりました。repo2サブモジュール内のコンテンツは引き続き追跡されますが、サブモジュールでコミットしない限り、ファイルへの変更ignoreme/は追跡されません。何らかの形で変更されたとしrepo2ましょう:ignoreme/ignore.txt

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   ignoreme (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")

を実行しても、次のようにサブモジュールにコミットされない限りgit add .、変更ignoreme/ignore.txtはインデックスに追加されません。

$ cd ignoreme
$ git commit -am"Time to change ignore.txt"
$ cd ..
$ git add .
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   ignoreme
#

ただし、サブモジュールのローカルの変更を忘れたい場合:

$ cd ignoreme
$ git reset --hard
$ cd ..
于 2012-05-30T06:17:02.167 に答える
1

Git はディレクトリを保存しません。Git に空のディレクトリを保持したい場合は、慣習として、そこに という名前の空のファイルを置き.keepme、それをコミットします。

質問に関しては、私の知る限りでは、上流のブランチにあるファイルをそのクローンから隠すことはできません。これは、Git が行うように設計されたものではありません。2 つのリポジトリに分割する (そして、おそらくサブツリーまたはサブモジュールを使用する) など、他のオプションを検討してください。または、ダウンストリームで追跡できるようにアップストリームに別のブランチを保持しignore.txt、post-receive フックでそのブランチから をフィルタリングします。

なぜこれをやりたいのかをもっと教えてください。もっと良い方法があるかもしれません。

いずれにせよ、「セキュリティ」の理由でこのファイルを隠そうとしないことを願っています。

于 2012-05-18T05:06:45.380 に答える
0

そのファイルを含むコミットをチェックアウトすると、そのファイルが置き換えられ、そのファイルを含むコミットからそれを含まないコミットに移行すると、そのファイルが削除されます。Gitは他に何もできませんでした。.gitignoreはリポジトリを上書きしません。これは、ステータスレポートに綿毛を付けないようにするのに便利です。

ファイルをgitの領域外の場所へのシンボリックリンクにすることができます。これにより、悪い履歴を簡単にチェックすることで、被害からの回復が可能になります。それがオプションでない場合は、フィルターブランチがあります。

于 2012-05-18T05:17:52.270 に答える
0

Git only applies ignore patterns to untracked files. You can't use ignore patterns to ignore changes to files that are already tracked by git. Still, see https://gist.github.com/1423106 for ways people have worked around the problem.

Note if you are worried about .gitignore itself, you can try using .git/info/excludes for a local-repo-only .gitignore file. Note this will not solve the problem of changing tracked files, only give you supplemental .gitignores which will not be tracked.

于 2012-07-19T00:12:33.913 に答える