250

シンボリックリンクをコピーに置き換えるシェルスクリプトを使用するのが最善ですか、それともGitにシンボリックリンクをたどるように指示する別の方法がありますか?

PS:あまり安全ではないことは知っていますが、特定の場合にのみ実行したいと思います。

4

14 に答える 14

164

シンボリックリンク内のファイルをGitに取得するために追加したこと(シンボリックリンクは使用しませんでしたが):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

このコマンドは、Git が管理するディレクトリで実行します。をマウントするTARGETDIRECTORY前に作成する必要があります。SOURCEDIRECTORY

Linux では正常に動作しますが、OS X では動作しません! そのトリックは、Subversion でも役に立ちました。私はこれを使用して、ウェブ デザイナーが作業を行う Dropbox アカウントのファイルを含めます。

このバインドを永続的にしたい場合は、次の行を に追加します/etc/fstab

/sourcedir /targetdir none bind
于 2010-01-16T23:31:39.860 に答える
81

逆にシンボリックリンクを作成してみませんか?つまり、Gitリポジトリからアプリケーションディレクトリにリンクするのではなく、その逆にリンクするだけです。

たとえば~/application、構成ファイルを必要とするにインストールされているアプリケーションをセットアップしているとしましょうconfig.conf

  • config.confたとえば、Gitリポジトリに追加します~/repos/application/config.conf
  • ~/application次に、を実行して からシンボリックリンクを作成しますln -s ~/repos/application/config.conf

このアプローチは常に機能するとは限りませんが、これまでのところうまく機能しました。

于 2011-04-26T07:33:43.017 に答える
45

注: Git 1.6.1 以降、このアドバイスはコメントごとに古くなっています。Git は以前はこのように動作していましたが、現在はそうではありません。


デフォルトでは、Git はシンボリック リンクをたどる代わりに保存しようとします (コンパクトにするためであり、一般的に人々が望んでいることです)。

ただし、シンボリックリンクがディレクトリの場合、シンボリックリンクを超えてファイルを追加することができました。

すなわち:

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

することによって

 git add /bar/foo/baz

私が試したところ、うまくいくように見えました。ただし、その動作は当時の私には望ましくなかったので、それ以上の情報を提供することはできません.

于 2008-09-17T19:03:00.607 に答える
29

これは、インデックス内のシンボリック リンク blob をそれらのシンボリック リンクのコンテンツに置き換えるpre-commit フックです。

これを に入れ、.git/hooks/pre-commit実行可能にします:

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

ノート

可能な限り POSIX 準拠の機能を使用しています。ただし、diff -aPOSIX に準拠していない可能性があります。

このコードはある程度テストされていますが、間違い/エラーがある可能性があります。

于 2013-09-09T06:30:49.530 に答える
19

macOS (私は Mojave/ 10.14、gitバージョン 2.7.1 を使用しています) では、bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>

他のコメントで示唆されていますが、他の回答では明確に提供されていません。うまくいけば、これで誰かの時間を節約できます。

于 2019-01-10T02:14:59.473 に答える
14

私はかなり長い間、シンボリックリンクを超えてファイルを追加していました。これは、特別な調整をしなくても問題なく機能していました。Git 1.6.1 にアップデートしてから、これが機能しなくなりました。

これを機能させるには、Git 1.6.0 に切り替えることができる場合があります。Git の将来のバージョンで、git-add再びシンボリック リンクをたどることができるようにフラグが設定されることを願っています。

于 2009-01-01T20:31:34.163 に答える
7

Git 2.3.2+ (2015 年第 1 四半期) では、Git がシンボリック リンクをたどらない別のケースが 1 つあります。 Junio C Hamanoによるコミット e0d201bを参照してください ( ) (メインの Git メンテナー)gitster

apply: シンボリック リンクを超えてファイルに触れないでください

Git はシンボリック リンクをシンボリック リンクとして追跡するため、先頭部分にシンボリック リンクを含むパス (たとえばpath/to/dir/file、 wherepath/to/dirは作業ツリーの内部または外部のどこかへのシンボリック リンク) は、有効に適用されるパッチに表示されることはありません。 、同じパッチが最初にシンボリックリンクを削除して、そこにディレクトリを作成できるようにしない限り。

そのようなパッチを検出して拒否します。

同様に、input がシンボリック リンクpath/to/dirを作成してから file を作成するpath/to/dir/file場合、実際にファイル システムにシンボリック リンクを作成せずに、エラーとしてフラグを立てる必要がありpath/to/dirます。

代わりに、結果にパスを残す (つまり、削除されていない) 入力内のパッチについては、入力内のすべてのパッチを検査してからパッチのターゲットを検査することによって、パッチが作成する結果のツリーに対してすべての先行パスをチェックします。アプリケーション (インデックスまたは作業ツリー)。

このようにして、私たちは:

  • path/to/dirシンボリックリンクとファイルpath/to/dir/fileを同時に追加するイタズラやミスをキャッチし、
  • シンボリックを削除しlink path/to/dirてからファイルを追加する有効なパッチを許可しながらpath/to/dir/file

つまり、その場合、エラー メッセージは のような一般的なもの"%s: patch does not apply"ではなく、より具体的なものになります。

affected file '%s' is beyond a symbolic link
于 2015-03-04T06:39:40.157 に答える
4

うーん、mount --bindDarwin では動作しないようです。

誰かがそうするトリックを持っていますか?

[編集]

OK、Mac OS X での答えはハードリンクを作成することであることがわかりました。ただし、その API は を介し​​て公開されていないlnため、これを行うには独自の小さなプログラムを使用する必要があります。そのプログラムへのリンクは次のとおりです。

Mac OS X でのディレクトリ ハード リンクの作成

楽しみ!

于 2010-02-18T22:21:45.053 に答える
0

シンボリックリンクからの変換が役立つ場合があります。スクリプトによるシンボリック リンクの代わりに、Git フォルダーにリンクします。

于 2012-08-19T19:37:54.463 に答える
0

私は Git 1.5.4.3 を使用していますが、末尾にスラッシュがある場合は、渡されたシンボリック リンクをたどっています。例えば

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/
于 2009-07-29T12:29:46.250 に答える