git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git fast-export not preserving executable permissions?

From
Taylor Blau <me@ttaylorr.com>
Date
May 1, 2020, 22:32 UTC
Message-ID
<20200501223240.GG41612@syl.local>
In-Reply-To
<CAHTRwmhhQCs4i04atAK66REiFJP_9e910MoYMt9iyu2v6S2jVw@mail.gmail.com>
On Fri, May 01, 2020 at 09:35:28AM -0400, Doug Glidden wrote:
> Taylor,

(My full response is below, but please in general do not top-quote mail here.)

Show 12 quoted lines
>
> Thanks for your response! It looks like git does not actually
> recognize the file as executable:
>
>     $ git ls-tree HEAD
>     100644 blob 7d2f57b2381766924e1e4ffcc62615c637bbd784    executable_script.sh
>     100644 blob d1d7cf309e091f54f268503b31653d8eba42fe88
> non_executable_file.txt
>
> Now you have me wondering if the real problem here is that I'm working
> in git-bash on a Windows machine, which means the file permissions
> aren't completely native.

I was wondering if that was the case ;-). If you are using NTFS or FAT32, neither of these filesystems support execute permission bits. (I am certainly not an expert here, but I know that Dscho (cc'd) would be able to answer authoritatively here.)

That said, *Git* understands executable permissions, even if your filesystem doesn't. You can tell Git to mark a file as executable by the following:

  $ git update-index --chmod=+x /path/to/file

and then committing the result. Round-tripping this through 'git fast-{im,ex}port' should preserve the permissions from Git's perspective, and ditto for checking out the contents of a repository on a filesystem that does support the executable permission bit.

> I'm going to run a similar experiment in a native Linux environment
> and see if I get the same results. I'll let you know what I find.
Sounds good. I'll be very surprised if it doesn't work as you expect.
Show 93 quoted lines
> Thanks,
> Doug
>
>
>
> On Wed, Apr 29, 2020 at 2:49 PM Taylor Blau <me@ttaylorr.com> wrote:
> >
> > Hi Doug,
> >
> > On Wed, Apr 29, 2020 at 09:36:31AM -0400, Doug Glidden wrote:
> > > Hello Git world!
> > >
> > > I have run into an issue that I cannot seem to resolve with git
> > > fast-export. When running a fast-export on a repo that contains
> > > scripts with executable permissions (e.g. a gradlew script), the
> > > resulting export does not properly reflect the executable permissions
> > > on the script files.
> >
> > Interesting. fast-import and fast-export both understand executable
> > modes (although Git only understands the modes 644 and 755 for blobs),
> > so this should be working.
> >
> > I can not reproduce the issue as-is. Round-tripping a fast-import and
> > fast-export preserves executable bits for me:
> >
> >   #!/bin/bash
> >
> >   set -e
> >
> >   rm -rf repo client
> >
> >   git init -q repo
> >   git init -q client
> >
> >   (
> >     cd repo
> >     printf "x" >x
> >     printf "y" >y
> >     chmod +x x
> >     git add x y
> >     git commit -q -m "initial commit"
> >   )
> >
> >   git -C repo fast-export HEAD | git -C client fast-import
> >
> >   diff -u <(git -C repo ls-tree HEAD) <(git -C client ls-tree HEAD)
> >
> > > To illustrate this issue, I created a small sample repo, with one
> > > executable file and one non-executable file. From the output below,
> > > you can see that the mode in the output from fast-export is the same
> > > for both files; according to the documentation for fast-import, the
> > > mode for the executable file should be 100755 instead of 100644.
> > >
> > >     $ ls -gG
> > >     total 2
> > >     -rwxr-xr-x 1 106 Apr 29 09:13 executable_script.sh*
> > >     -rw-r--r-- 1  63 Apr 29 09:12 non_executable_file.txt
> > >
> > >     $ git fast-export --all
> > >     blob
> > >     mark :1
> > >     data 106
> > >     #!/bin/bash
> > >
> > >     # This is a shell script that should be executable.
> > >     echo 'The script executed successfully!'
> > >
> > >     blob
> > >     mark :2
> > >     data 63
> > >     This file is a simple text file that should not be executable.
> > >
> > >     reset refs/heads/dev
> > >     commit refs/heads/dev
> > >     mark :3
> > >     author Doug <41mortimer@gmail.com> 1588167102 -0400
> > >     committer Doug <41mortimer@gmail.com> 1588167102 -0400
> > >     data 25
> > >     Adding some sample files
> > >     M 100644 :1 executable_script.sh
> > >     M 100644 :2 non_executable_file.txt
> > >
> > > Please let me know if there is any further information I can provide
> > > about this issue.
> >
> > Does Git think that the file is executable? Please run 'git ls-tree
> > HEAD' to find out.
> >
> > > Thank you,
> > > Doug
> >
> > Thanks,
> > Taylor

Thanks, Taylor

Previous: Doug GliddenNext: Johannes Schindelin
Message 4 of 6 in “git fast-export not preserving executable permissions?”
  1. Doug GliddenApr 29, 2020
  2. Taylor BlauApr 29, 2020
  3. Doug GliddenMay 1, 2020
  4. Taylor BlauMay 1, 2020
  5. Johannes SchindelinMay 4, 2020
  6. Torsten BögershausenApr 30, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.