web-dev-qa-db-ja.com

シンボリックリンクを無視するようにgitに指示する

この質問は herehere のような形で現れましたが、私が探しているものと一致しないようです。

StaticMaticでプロジェクトを作成しています。Ruby静的サイトジェネレーターです。基本的には、Hamlテンプレート、Sass、CoffeeScriptを備えたsrc /ディレクトリです。 build /で静的サイトを生成するビルドコマンドと同様に、静的サイトに移動します。

StaticMaticに対する私の変更は、src/_modules/foo/bar.hamlを含むかもしれないsrc/_modules/foo /の追加を許可することです。サーバーの実行時またはサイトの構築時に、foo /内のファイルを指すsrc/bar.hamlにシンボリックリンクが作成されます。

ここまでは順調ですね。 (競合の処理など)

_modules /の個別のディレクトリの背後にある理由は、それらがgitサブモジュールとして追跡され、他のチームによって独立してチェックアウトされる可能性があるためです。基本的に、これにより、メインレイアウトなどを複製することなく、複数のチームが1つの静的サイトの異なるページ(実際にはJSアプリ)で作業できます。

問題は、gitがこれらのシンボリックリンクをファイルとして考えたいということです。例えば、 git statusショー:

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be commited)
#
#       src/_modules/bar/foo.haml
#       src/foo.haml

...本当に表示したいときはsrc/_modules/bar/foo.hamlおよび無視するsrc/foo.haml

1つのアプローチは、リンクを生成するコードにリンクを.gitignoreに追加させることですが、.gitignoreをいじるとエラーが発生しやすくなります。 (おそらく、この懸念は合理的ではないでしょうか?)

私の理想的な修正は次のようなものです:

[filetype = link]

.... gitignoreで。私の知る限り、このようなことは何もできませんか?

48
user225643

これは良いアイデアのようです

find . -type l | sed -e s'/^\.\///g' >> .gitignore

Findは、すべてのファイルに「./」プレフィックスを出力します。あなたがそれをトリムしない限り、gitignoreはそれらに作用することができません。最初に「。\」をトリムすると、チャームのように機能します

21
Biswajit_86

使用しているgitのバージョンに応じて、シンボリックリンクをたどる必要があります。 core.symlinksを設定する設定があります。これはfalseに設定されているため、gitをディレクトリとして追跡させません(git> = 1.6と仮定)。シンボリックリンクスクリプトにこれらのリンクを.gitignoreファイルに追加するか、自分で追加することは完全に合理的です。 find . -type l >> .gitignoreのようなこともできます

18
edwardsharp

シンボリックリンクされたディレクトリまたは実際のディレクトリを無視する必要がある同じような問題がありましたが、notのサブディレクトリ名前または同じ文字で始まるファイル。例えば:

  • 無視シンボリックリンク)./media
  • 無視-(ディレクトリ)./media
  • 無視しないでください-./something/media
  • 無視しないでください-./media.bak
  • 無視しないでください-./media-somethingelse

私はこれを.gitignoreで使用することになりました:

media
!*/media

これは少し奇妙に見えますが、基本的には(行1)「メディア」をすべて無視しますが(行2)---(しないルートディレクトリにない「メディア」を無視します。このメソッドは、(サブディレクトリ内のものを無視しないという点で)少し​​特異性を必要としますが、適応/拡張が非常に簡単でなければなりません。

10
Chris Rasys

別の質問 からの私の答えは関連しています:

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
3
ColinM

私は私に最も適したソリューション-命名契約を使用しました。

With filesソリューションの各ファイルへのシンボリックリンクには、「bla.outsidemodule.ts」のような名前のプレフィックスがありました。 .gitignoreファイルには、次のものがありました。

**/*.outsidemodule.*

With folderソリューションのルートにも、ソリューションのその他の部分に共通のlibs/modulesがあるフォルダー「platform」がありました。構造は次のようになりました。

 - ./platform              <- sources
 - ./client/src/platform   <- symlink to ./platform
 - ./server/src/platform   <- symlink to ./platform
 - ./exchange/src/platform <- symlink to ./platform
 - ./service/src/platform  <- symlink to ./platform

そして、.gitignoreだけで:

**/platform <- exclude all "platform" folders
!./platform <- do not exclude folder "platform" if it's on a root 
1
Dmitry Astafyev

私はリポジトリに実行可能ファイルとシンボリックリンクを保持しません...なので、「git status」を実行するときにもそれらを省略したいと思います。

私のように、シンボリックリンク、ディレクトリ、実行可能ファイル($ NAG_HOME/libexec内のファイルの一部を無視したい場合、次のようにこれらのファイルを.gitignoreに追加できます。

   file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print $1 }' >> .gitignore

   echo ".gitignore" >> .gitignore

次に、gitステータスを実行するときに、リポジトリに追加していない場合、これらのファイルのリストを吐き戻しません。

0
Larry Helms

私の解決策はばかげているように思えるかもしれませんが、新しいファイルが追加されるたびに.gitignoreファイルを更新するよりも、これを実行したいです。

リンクを「link to xxx」などのデフォルト名のままにして、次の行を.gitignoreファイルに追加します。

link to *

次に、「link to」で始まる名前で他のファイル/フォルダに名前を付けないようにし、ソートされていることを確認します。

0
L33tCh