エラー:パラメータリストが長すぎます。
sudo cp
そしてfind... -exec sudo cp
出力
/usr/bin/sudo(or find): Argument list too long
Travis CIビルド出力でこのエラーが発生します。私の.travis.ymlファイルはシェルスクリプト(deploy.sh)を使用してBranch2のforce-appフォルダに対して実行され、git diff
出力(何千ものファイル)はcp
新しいディレクトリにあります。
sudo cp --parents $(git diff --name-only branch2 force-app/) $DEPLOYDIRECTORY;
エラーは2行です。
./deploy.sh: line 122: /usr/bin/git: Argument list too long
./deploy.sh: line 122: /usr/bin/sudo: Argument list too long
私も後で同じ問題がありました。探す注文する。私は命名規則を使用してgit diffの各ファイルに対応するファイルを見つけてコピーします。
for FILE in $GIT_DIFF_FILES; do
if [[ $FILE == *Test.cls ]]; then
find $classPath -maxdepth1 -samefile "$FILE-meta.xml" -exec sudo cp --parents {} $DEPLOY_DIRECTORY +
fi;
done;
再度エラーが発生します./deploy.sh: line 142: /usr/bin/find: Argument list too long
。
メモ:Travis CIは、このビルド用にUbuntu Linux(Xenial)仮想環境を実行しています。
私が試したこと
1.スタックサイズのリセット
Travis CIは自動的にスタックサイズを次のように設定します。8192引数の最大値は8388608新しいビルドごと。私の配布.shファイルでulimit -s 9999999
スタックサイズを次のように変更しました。9999999引数の最大値は2559999744新しいビルドごと。
2. コマンドの変更
sudo cp
私が試した最初のコマンドは次のとおりです。
- フォーマットコマンドは
for loop
tar -cf - -C files... | tar xpf - -C target directory...
- フォーマットコマンドは
git diff ... | xargs cp ...
find
私が試したコマンドについて:
find ... | xargs -n 1000 sudo cp ....
- このコマンドに追加された他のフラグも効果がありません。
find ... -exec cp ...
- フラグや構文を変更すると、同じエラーが返されます。
コマンドを変更することは解決策ではないようです。
ローカルでエラーを再現した後、少数のファイル(〜1000個以下)と対話したときに、私のコマンドがすでに正しく機能していることがわかりました。
ただし、出力がcp
おおよそ次のような場合find
git diff
1200~1500以上のファイル次に、次を返します。
パラメータリストが長すぎます。
また、または私のシェルスクリプトを実行すると、次もfind
返されます。cp
パラメータリストが長すぎます。
したがって、このコマンドで何をするかは重要ではないようです。より根本的な原因は問題の原因ですが、出力されるファイル数がgit diff
約1200ファイルを超える場合にのみ該当します。
cp
myとコマンドをどのように変更しますかfind
?
エラーを再現する方法
マイユースケースに応じて、このエラーを再現するために実行する必要がある手順は次のとおりです。私はVS Codeを使ったので、できるだけ私と同じように複製してみることをお勧めします。USERNAME
次のコードをユーザー名に置き換える必要があります。
ステップ1:フォークこの倉庫。
ステップ2:端末で、以下のコードの各行を一度に1行ずつ実行します。
cd force-app/main/default
新しいフォルダ「diff」を作成します。その後、以下を続けてください。
git checkout -b branch2
cd force-app/main/default/classes
//comment
下部に追加myclass.clsそしてmyclass.cls-meta.xml文書。変更を保存します。
for n in {001..1500}; do cp myclass.cls myclass$n.cls; done
for n in {001..1500}; do cp myclass.cls-meta.xml myclass$n.cls-meta.xml; done
git add .
git commit -m “first commit”
git push --set-upstream origin branch2
git checkout master
for n in {001..1500}; do cp myclass.cls myclass$n.cls; done
for n in {001..1500}; do cp myclass.cls-meta.xml myclass$n.cls-meta.xml; done
git add .
git commit -m “second commit”
git push
cd
sfdx-travisciフォルダに戻ります。
sudo cp -p $(git diff --name-only branch2 /Users/USERNAME/sfdx-travisci/force-app/main/default/classes) /Users/USERNAME/sfdx-travisci/force-app/main/default/diff
for file in $(sudo cp -p $(git diff --name-only branch2 /Users/USERNAME/sfdx-travisci/force-app/main/default/classes) /Users/USERNAME/sfdx-travisci/force-app/main/default/diff); do if [[ $file == *.cls ]]; then find /Users/USERNAME/sfdx-travisci/force-app/main/default/classes -samefile “$file-meta.xml” -exec sudo cp -p {} /Users/USERNAME/sfdx-travisci/force-app/main/default/diff +; fi; done;
ベストアンサー1
複雑なコピーコマンドの置き換え:
tar -cf - -C /home/auser/data . | tar xpf - -C /home/auser/data2