On 18/09/2016 22:15, Lucas Hoffmann wrote:
Quoting Brian Candler (2016-09-18 17:54:21)
>Another option I would like to see is to be able to use multiple git
>repos within the tree.
Did you read my response before yours?  Do you know about git
submodules?  Maybe they can help you.

I didn't have a chance to try it out until now, but now I have.

TL;DR: it doesn't work.

Long version: let's try it in full. Make three repos, clone them, add them to an outer unified repo, and then run password-store in that.

$ mkdir /tmp/foo /tmp/bar /tmp/baz

$ for i in /tmp/foo /tmp/bar /tmp/baz; do (cd $i && git init .); done
Initialized empty Git repository in /private/tmp/foo/.git/
Initialized empty Git repository in /private/tmp/bar/.git/
Initialized empty Git repository in /private/tmp/baz/.git/

$ for i in /tmp/foo /tmp/bar /tmp/baz; do (PASSWORD_STORE_DIR=$i pass init [email protected]); done
Password store initialized for [email protected]

...

$ PASSWORD_STORE_DIR=/tmp/foo pass edit one
...

$ PASSWORD_STORE_DIR=/tmp/bar pass edit two
...

$ PASSWORD_STORE_DIR=/tmp/baz pass edit three
...

$ PASSWORD_STORE_DIR=/tmp/foo pass one

You need a passphrase to unlock the secret key for
user: "Brian Candler <[email protected]>"
...

ONE


OK so far. Now to create a new repo with three submodules:


$ mkdir /tmp/unified
$ cd /tmp/unified
$ git init .
Initialized empty Git repository in /private/tmp/unified/.git/
$ git submodule add /tmp/foo
Cloning into 'foo'...
done.
$ git submodule add /tmp/bar
Cloning into 'bar'...
done.
$ git submodule add /tmp/baz
Cloning into 'baz'...
done.
$ git commit -m 'Added submodules'
[master (root-commit) c89167a] Added submodules
 4 files changed, 12 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 bar
 create mode 160000 baz
 create mode 160000 foo

$ PASSWORD_STORE_DIR=/tmp/unified pass list
Password Store
├── bar
│   └── two
├── baz
│   └── three
└── foo
    └── one
$ PASSWORD_STORE_DIR=/tmp/unified pass foo/one

You need a passphrase to unlock the secret key for
user: "Brian Candler <[email protected]>"
...

ONE


Again no problem: reading a password works fine. But what about when you want to edit one?


$ PASSWORD_STORE_DIR=/tmp/unified pass edit foo/one

You need a passphrase to unlock the secret key for
user: "Brian Candler <[email protected]>"
2048-bit ELG-E key, ID B4439488, created 2008-06-30 (main key ID EBF0ECF0)


You need a passphrase to unlock the secret key for
user: "Brian Candler <[email protected]>"
2048-bit ELG-E key, ID B4439488, created 2008-06-30 (main key ID EBF0ECF0)

*fatal: Pathspec '/tmp/unified/foo/one.gpg' is in submodule 'foo'**
*

So it's broken. My guess is it's trying to do a "git add" from the outer repo, when the modified file is in the inner repo.

Checking the status by hand:

$ cd /tmp/unified
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

    modified:   foo (modified content)

no changes added to commit (use "git add" and/or "git commit -a")
$ cd /tmp/unified/foo
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   one.gpg

no changes added to commit (use "git add" and/or "git commit -a")


In summary: whatever password-store is doing, it doesn't work with submodules. I am able to fix it up by doing commits separately in the inner repo and the outer one:

$ cd /tmp/unified/foo/
$ git commit -am 'Updated foo'
[master 60e939b] Updated foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 rewrite one.gpg (100%)
$ cd /tmp/unified/
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   foo (new commits)

no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -am 'Updated unified'
[master 564b675] Updated unified
 1 file changed, 1 insertion(+), 1 deletion(-)


Note: I have not yet tested "git push"; that would require the target to be a bare repo, so the test environment would have to be set up a bit differently. But again, I would expect to have to do a "git push" within the inner repo, *and* a "git push" within the outer one.

(Actually the outer repo is just holding pointers to the inner ones, so it doesn't matter that much. What matters is doing a git push on the inner ones)

According to https://git-scm.com/book/en/v2/Git-Tools-Submodules, I think this might be possible using the "--recurse-submodules=on-demand" flag - but password-store doesn't invoke that.

Regards,

Brian.

_______________________________________________
Password-Store mailing list
[email protected]
http://lists.zx2c4.com/mailman/listinfo/password-store

Reply via email to