@@ -247,7 +247,8 @@ static void parse_pathspec_arg(const char **pathspec,
247247}
248248
249249static void parse_treeish_arg (const char * * argv ,
250- struct archiver_args * ar_args , const char * prefix )
250+ struct archiver_args * ar_args , const char * prefix ,
251+ int remote )
251252{
252253 const char * name = argv [0 ];
253254 const unsigned char * commit_sha1 ;
@@ -256,8 +257,17 @@ static void parse_treeish_arg(const char **argv,
256257 const struct commit * commit ;
257258 unsigned char sha1 [20 ];
258259
259- if (get_sha1 (name , sha1 ))
260- die ("Not a valid object name" );
260+ /* Remotes are only allowed to fetch actual refs */
261+ if (remote ) {
262+ char * ref = NULL ;
263+ if (!dwim_ref (name , strlen (name ), sha1 , & ref ))
264+ die ("no such ref: %s" , name );
265+ free (ref );
266+ }
267+ else {
268+ if (get_sha1 (name , sha1 ))
269+ die ("Not a valid object name" );
270+ }
261271
262272 commit = lookup_commit_reference_gently (sha1 , 1 );
263273 if (commit ) {
@@ -414,7 +424,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
414424 setup_git_directory ();
415425 }
416426
417- parse_treeish_arg (argv , & args , prefix );
427+ parse_treeish_arg (argv , & args , prefix , remote );
418428 parse_pathspec_arg (argv + 1 , & args );
419429
420430 return ar -> write_archive (ar , & args );
0 commit comments