エラー:パラメータリストが長すぎます。

エラー:パラメータリストが長すぎます。

エラー:パラメータリストが長すぎます。

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私が試した最初のコマンドは次のとおりです。

  1. フォーマットコマンドはfor loop
  2. tar -cf - -C files... | tar xpf - -C target directory...
  3. フォーマットコマンドはgit diff ... | xargs cp ...

find私が試したコマンドについて:

  1. find ... | xargs -n 1000 sudo cp ....
    • このコマンドに追加された他のフラグも効果がありません。
  2. find ... -exec cp ...
    • フラグや構文を変更すると、同じエラーが返されます。

コマンドを変更することは解決策ではないようです。

ローカルでエラーを再現した後、少数のファイル(〜1000個以下)と対話したときに、私のコマンドがすでに正しく機能していることがわかりました。

ただし、出力がcpおおよそ次のような場合findgit diff1200~1500以上のファイル次に、次を返します。

パラメータリストが長すぎます。

また、または私のシェルスクリプトを実行すると、次もfind返されます。cp

パラメータリストが長すぎます。

したがって、このコマンドで何をするかは重要ではないようです。より根本的な原因は問題の原因ですが、出力されるファイル数がgit diff約1200ファイルを超える場合にのみ該当します。

cpmyとコマンドをどのように変更しますか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

cdsfdx-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

おすすめ記事