-
-
Notifications
You must be signed in to change notification settings - Fork 5.9k
Move git config/remote to gitrepo package and add global lock to resolve possible conflict when updating repository git config file #35151
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…lve possible conflict when updating repository git config file
No, it doesn't fix #32018 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't see why it is worth or right to do so, and don't see why it fixes that issue
In cases where |
So it is an improvement but doesn't "Fix #32018", right? But does it really need the "global lock"? Is it possible that git already uses "*.lock" files by |
The Git command-line interface is primarily designed for human interaction. When a git config write operation is initiated and a config.lock file is created, any subsequent git config write operation will immediately fail instead of waiting for the first one to complete. While I couldn’t find official documentation confirming this behavior, the implementation can be found in the Git source code here: Based on this, it appears that Git does not implement a locking mechanism that causes subsequent operations to wait—it simply fails fast. I believe this change partially addresses #32018, as there are three possible causes for the issue:
|
Git already does a file-based "global lock"
Update: git passes timeout=0, so it only locks "once" |
modules/gitrepo/config.go
Outdated
// FIXME: config related? long-time running? | ||
func GitRemoteUpdatePrune(ctx context.Context, repo Repository, remoteName string, timeout time.Duration, stdout, stderr io.Writer) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it is right to use global lock for long-time running commands.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
…a into lunny/fix_git_config_conflict
Partially fix #32018
git config
andgit remote
write operations create a temporary file namedconfig.lock
. Since these operations are not atomic, they must not be run in parallel. If two requests attempt to modify the same repository concurrently—such as during a compare operation—one may fail due to the presence of an existingconfig.lock
file.In cases where
config.lock
is left behind due to an unexpected program exit, a global lock mechanism could allow us to safely remove the stale lock file when a related error is detected. While this behavior is not yet implemented in this PR, it is planned for a future enhancement.