diff --git a/src/workflow/ArcanistDiffWorkflow.php b/src/workflow/ArcanistDiffWorkflow.php --- a/src/workflow/ArcanistDiffWorkflow.php +++ b/src/workflow/ArcanistDiffWorkflow.php @@ -2900,6 +2900,10 @@ 'uri' => $staging_uri, ); + list($err, $stdout, $stderr) = exec_manual( + "git ls-files ':(attr:filter=lfs)'"); + $is_lfs = !empty($stdout); + // If the base commit is a real commit, we're going to push it. We don't // use this, but pushing it to a ref reduces the amount of redundant work // that Git does on later pushes by helping it figure out that the remote @@ -2923,7 +2927,7 @@ $refs[] = array( 'ref' => $diff_tag, 'type' => 'diff', - 'commit' => $commit, + 'commit' => $is_lfs ? $base_commit : $commit, 'remote' => $remote, ); @@ -2932,12 +2936,20 @@ $ref_list[] = $ref['commit'].':'.$ref['ref']; } + if ($is_lfs) { + exec_manual('git lfs uninstall'); + } + $err = phutil_passthru( 'git push %Ls -- %s %Ls', $push_flags, $staging_uri, $ref_list); + if ($is_lfs) { + exec_manual('git lfs install'); + } + if ($err) { $this->writeWarn( pht('STAGING FAILED'), @@ -2949,6 +2961,15 @@ 'use --skip-staging to skip this step.')); } + if ($is_lfs) { + $ref = '+'.$commit.':'.$diff_tag; + $err = phutil_passthru( + 'git push %Ls -- %s %s', + $push_flags, + $staging_uri, + $ref); + } + return $refs; }