私が受講するオペレーティングシステムのコースでは、Freebsd5.4を実行する必要があります。 gitがリリースされる前は、bsdバージョンでgitをビルドしたくなかったので、git
Archで使用するのはきれいになると思いましたsshfs
。
とにかく一つ見つけた解決策これは私がsshfs
選択を与えたことを示しています-o workaround=rename
。
幸せそうに見えますが、git
何が起こったのか混乱しています...
すべてマニュアルページ解決策は次のとおりです。
fix renaming to existing file
しかし、これはどういう意味なのかわかりません...
このオプションの役割は正確に何ですか?
答え1
sshfsはSSHファイル転送プロトコル(SFTP)を使用します。有効にする回避策は、「新しい」名前がすでに存在する場合にプロトコルで rename() 操作の意味を解決することです。
この場合、rename()のPOSIXの振る舞いは、既存のファイルを削除して名前変更を完了することです。
SFTP プロトコルでは、SSH_FXP_RENAME 操作でファイル名を変更できます。ただし、ターゲット名がすでに存在する場合の動作は、使用しているプロトコルのバージョンと渡すフラグによって異なります。これSFTPプロトコルのWikipediaページ様々なバージョンのプロトコルへの様々なRFCドラフトへのリンクがあります。存在するドラフト00当該法案は次のように記載されています。
newpathで指定した名前のファイルがすでに存在する場合、エラーが発生します。
存在するドラフト13、アクションは次のようにリストされます。
フラグにSSH_FXP_RENAME_OVERWRITEが含まれておらず、newpathで指定された名前のファイルがすでに存在する場合、サーバーはSSH_FX_FILE_ALREADY_EXISTSで応答する必要があります。
フラグに SSH_FXP_RENAME_ATOMIC が含まれていて、ターゲットファイルがすでに存在する場合は、アトミックに置き換えられます。つまり、古いファイルや新しいファイルを参照しない観測可能な特定の時点の名前はありません。 SSH_FXP_RENAME_ATOMIC は SSH_FXP_RENAME_OVERWRITE を意味します。
ターゲット名が存在する場合、 rename() 操作が失敗する可能性がある状況を処理するにはsshfsは次の回避策を提供します(有効になっている場合):
if (err == -EPERM && sshfs.rename_workaround) {
size_t tolen = strlen(to);
if (tolen + RENAME_TEMP_CHARS < PATH_MAX) {
int tmperr;
char totmp[PATH_MAX];
strcpy(totmp, to);
random_string(totmp + tolen, RENAME_TEMP_CHARS);
tmperr = sshfs_do_rename(to, totmp);
if (!tmperr) {
err = sshfs_do_rename(from, to);
if (!err)
err = sshfs_unlink(totmp);
else
sshfs_do_rename(totmp, to);
}
}
}
このコードでは、「from」は名前を変更するファイルの既存の名前、「to」は希望する新しい名前です。いくつかのパスの長さと誤った簿記の管理は取り除かれ、このソリューション
- 「to」の名前を「totmp」に変更します。
- 「from」を「to」に名前変更
- "totmp"の切断(削除)
これにより、「ファイルが既に存在する」競合を防ぐことができるだけでなく、 rename() 操作の意味も変更されるため、基本的にこれを実行したくないことになります。