web-dev-qa-db-ja.com

通常のファイルとしてのgitcommitシンボリックリンク

他のリポジトリ/プロジェクトからのファイルへのシンボリックリンクであるファイルfname、たとえば../../proj2/fnameがあるとします。

fnameを通常のファイルとして追加/コミットする方法はありますか?

デフォルトでは、gitはファイルモードを120000にし、リンクされたファイルへのパスをblobコンテンツとして設定しているようです。

git ls-treeはファイルのモード120000を示し、git cat-file -pはblobのコンテンツとして../../proj2/fnameを示しているので、私はこれを知っています。

31
hasen

いいえ、Gitはそれがシンボリックリンクであることを知っています。 Gitが他のふりをするのは危険です。ファイルに書き込むことになってしまうからです外部リポジトリ。シンボリックリンクとして追跡することは、まさに意図された動作です。

17
Cascabel

リンクの代わりにファイルを表示する場合は、おそらくlnコマンドを使用して、シンボリックリンクの代わりにハードリンクを作成する必要があります(ln -s)。

ハードリンクを作成すると、同じファイルを2つの異なるディレクトリに表示できるため、いずれかのリンクを介してファイルを変更すると、両方のリンクを介した変更が反映され、ファイルは両方のディレクトリに存在するため、gitによって追跡されます。 。

Windowsのmklink /j command in Bukovの答え これを行いますが、私は本当にまったく知りません。

46
mgarciaisaia

Windowsでは、ジャンクションを使用してやりたいことができます

たとえば、プログラムは設定ファイルをシステムのどこかに保持することがよくありますが、リポジトリでバージョン管理したいと思います。ファイルを移動できず、複製などを作成したくない

ただし、Windowsショートカットをリポジトリディレクトリに配置すると、バイナリの単一ファイルとして表示されます。含めたいすべての実際のファイルを指すディレクトリではありません

必要なのは、リポジトリに何かlike Windowsショートカットを配置する機能ですが、そのgitは単なる別のフォルダーとして扱われます。

cd /location/of/my/repo/  
mklink /j "_linkTo_VimSettings" "C:\Program Files (x86)\Vim"
3
Bukov

同じ問題が発生しました...シンボリックリンクされたファイルを含むディレクトリをGITリポジトリにアップロードして公開します。

GITリポジトリは、ファイルのプライマリソースではなく、セカンダリソースであるため、ローカルマシンのシンボリックリンクを置き換えたくありません。ハードリンクは壊れているので良くありません、そしてそれらがリンクであると見ると明らかではありません。

現在の解決策は、シンボリックリンクを一時的に置き換えるスクリプトであり、ハードリンクはgit commit/Pushを実行してから、シンボリックリンクを復元します。理想的には、スクリプトはシンボリックリンク情報を読み取って保存しますが、現在は、シンボリックリンクがどうあるべきかに関する組み込みデータを使用しているだけです...

もちろん、これは私がgituploadに使用するスクリプトの「例」にすぎません。

#!/bin/Perl
#
# Git Upload...
#
# 1/ Replace all symbolic links with hard links
# 2/ upload files into a GIT repository
# 3/ Restore symbolic links again.
#
# Only the list of symbolic links given in the DATA section are effected.
#
use strict;

# the relative location of files being included in git repository
my $source_prefix="../real_project/";

# note start of data
my $data_start=tell(DATA);

# Link all files needed for upload
while ( <DATA> ) {
  s/#.*$//;         # ignore comments
  s/\s+$//;         # remove end of line spaces
  next if /^$/;     # skip blank lines
  my($file, $source) = split;

  unlink($file);
  link("$source_prefix$source", $file)
     or warn("failed to find: $source");
}

system("git add -A");
system("git commit -a -m 'Software Export Update'");
system("git Push");

# rewind data section
seek DATA, $data_start, 0;

# unlink all files that have now been uploaded
while (<DATA>) {
  s/#.*$//;         # ignore comments
  s/\s+$//;         # remove end of line spaces
  next if /^$/;     # skip blank lines
  my($file, $source) = split;

  unlink($file);
  symlink("$source_prefix$source", $file);
  #  or warn("failed to find: $source");
}

__DATA__

### Example symbolic links (to replace and restore)
  script.pl.txt            scripts/script
  data_file.txt            lib/data_file.dat

# this file is not a symlink as a it slightly modified
# but listed to keep a record of its original source
# config_example.txt       extra/config
0
anthony