![参照ファイルをシンボリックリンクに置き換える](https://rvso.com/image/1438158/%E5%8F%82%E7%85%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B.png)
私が作業している Git リポジトリには、別のフォルダー内のファイルとフォルダーへのシンボリックリンクにする必要があるファイルとフォルダーがあります。すべてのシンボリックリンクは、2 番目のプロジェクト フォルダーでテキストとして参照されます。すべてのシンボリックリンクを自動的に設定する方法を知りたいだけです。
構造例
project1/
---- myfile.rb
---- myfolder/
project2/
---- myfile.rb
---- myfolder
そしてファイルにはプロジェクト2/myfile.rb1 行目には次のテキストのみが含まれます。
../project1/myfile.rb
そしてプロジェクト2/私のフォルダテキストのみを含む
../project1/myfolder
これはファイル構造全体で繰り返されます。別の例は次のとおりです。
プロジェクト2/app.rbテキストがある
../project2/app.rb
私は Ubuntu を使用していますが、これらを手動で 1 つ 1 つ探すのではなく、自動的に調べてシンボリック リンクを設定する方法があるのではないかと考えています。
答え1
Git はシンボリックリンクをバージョン管理できないので、そのようなファイルではなくシンボリックリンクをバージョン管理することを検討してください。また、2 つのリポジトリ間に実際の関係が存在するように、Git サブモジュールを検討することもできます。
質問/設定が正しければ、これでうまくいくかもしれません。これは、./project2
行数が 1 のフォルダー内のファイルを (再帰的に) 検索し、ターゲットが存在する場合は、それらの各ファイルをそこに名前が付けられたファイルへのリンクに置き換えます。
#!/bin/bash
for file in $(find project2/ -type f )
do
linecount=$(wc -l $file | awk '{print $1}')
if [ $linecount -eq 1 ]; then
target=$(cat $file)
relTarget=$(dirname $file)/$target
if [ -f $relTarget ] || [ -d $relTarget ]; then
rm $file
ln -s $target $file
fi
fi
done
答え2
ディレクトリ内から以下を実行しますproject2
。
for file in *; do
link="$(cat "$file")"
rm "$file"
ln -s "$link" "$file"
done
これは再帰的ではないので、サブディレクトリは検索されません。