Vivasoft-logo

ā§­.ā§§ā§Ē āĻ—āĻŋāϟ āϟ⧁āϞāϏ – āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ

āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϰāĻŋāĻŽā§‹āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ SSH transport āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻžāϰ āĻĒāĻ•ā§āώ⧇ passphrase āĻ›āĻžāĻĄāĻŧāĻžāχ āĻāĻ•āϟāĻŋ āϕ⧀(Key) āĻĨāĻžāĻ•āĻž āϏāĻŽā§āĻ­āĻŦ, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āχāωāϜāĻžāϰāύ⧇āĻŽ(username) āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ(password) āϟāĻžāχāĻĒ āύāĻž āĻ•āϰ⧇ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āĻĄā§‡āϟāĻž āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āϝāĻžāχāĻšā§‹āĻ•, HTTP āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻ­āĻŦ āύāϝāĻŧ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻ‚āϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āχāωāϜāĻžāϰāύ⧇āĻŽ(username) āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ(password) āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āĻāϟāĻŋ āĻĻā§āĻŦāĻŋāĻĢā§āϝāĻžāĻ•ā§āϟāϰ(Two-factor) āĻ…āĻĨ⧇āύāϟāĻŋāϕ⧇āĻļāύ(Authentication) āϏāĻš āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āφāϰāĻ“ āĻ•āĻ āĻŋāύ āĻšāϝāĻŧ⧇ āĻ“āϠ⧇, āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻŋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āϝ⧇ āĻŸā§‹āϕ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ āϤāĻž āĻāϞ⧋āĻŽā§‡āϞ⧋āĻ­āĻžāĻŦ⧇ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āωāĻšā§āϚāĻžāϰāĻŖāϝ⧋āĻ—ā§āϝ āύāϝāĻŧāĨ¤

āϏ⧌āĻ­āĻžāĻ—ā§āϝāĻŦāĻļāϤ, āĻ—āĻŋāĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻāϟāĻŋāϤ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ—āĻŋāĻŸā§‡āϰ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āύāĻŋāĻšā§‡āĻ°Â  āĻŦāĻžāĻ•ā§āϏ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϞ:

 

  • āĻĄāĻŋāĻĢāĻ˛ā§āϟ āϏāĻŦ āĻ•ā§āϝāĻžāĻļ(cache) āĻ•āϰāĻž āĻšāϝāĻŧ āύāĻž. āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻ‚āϝ⧋āĻ— āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻŦ⧇āĨ¤

 

  • āĻ•ā§āϝāĻžāĻļ⧇āĻŽā§‹āĻĄ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϕ⧇ āχāύāĻŽā§‡āĻŽāϰāĻŋāϤ⧇ āϰāĻžāϖ⧇āĨ¤ āϕ⧋āύ⧋ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ•āĻ–āύ⧋āχ āĻĄāĻŋāĻ¸ā§āϕ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻĨāĻžāϕ⧇ āύāĻž āĻāĻŦāĻ‚ 15 āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻĒāϰ āĻ•ā§āϝāĻžāĻļ āĻĨ⧇āϕ⧇ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāϝāĻŧāĨ¤

 

  • āĻ¸ā§āĻŸā§‹āϰāĻŽā§‹āĻĄ āĻĄāĻŋāĻ¸ā§āϕ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϞ⧇āχāύāĻŸā§‡āĻ•ā§āϏāϟ āĻĢāĻžāχāϞ⧇ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϰ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ āĻšāϝāĻŧ āύāĻžāĨ¤ āĻāϰ āĻŽāĻžāύ⧇ āĻšāϞ āϝ⧇ āφāĻĒāύāĻŋ āĻ—āĻŋāϟ āĻšā§‹āĻ¸ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āύāĻž āĻ•āϰāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ, āφāĻĒāύāĻžāϕ⧇ āφāϰ āĻ•āĻ–āύāĻ“ āφāĻĒāύāĻžāϰ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϟāĻžāχāĻĒ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āύāĻžāĨ¤ āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϰ āύ⧇āϤāĻŋāĻŦāĻžāϚāĻ• āĻĻāĻŋāĻ• āĻšāϞ āϝ⧇ āφāĻĒāύāĻžāϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āĻšā§‹āĻŽ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϞ⧇āχāύ āĻĢāĻžāχāϞ⧇ āĻ•ā§āϞāĻŋāϝāĻŧāĻžāϰāĻŸā§‡āĻ•ā§āϏāĻŸā§‡ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

 

  • āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŽā§āϝāĻžāĻ•(Mac) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āĻ—āĻŋāϟ āĻāĻ•āϟāĻŋ “osxkeychain” āĻŽā§‹āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āφāϏ⧇, āϝāĻž āφāĻĒāύāĻžāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϕ⧀āĻšā§‡āχāĻ¨Â  āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āĻ•ā§āϝāĻžāĻļ⧇ āĻ•āϰ⧇āĨ¤ āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āĻĄāĻŋāĻ¸ā§āϕ⧇ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋ āĻ•āĻ–āύāχ āĻŽā§‡āϝāĻŧāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āĻŖ āĻšāϝāĻŧ āύāĻž, āϤāĻŦ⧇ āϏ⧇āϗ⧁āϞāĻŋ āĻāĻ•āχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϏāĻžāĻĨ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ āϝāĻž HTTPS āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻāĻŦāĻ‚ āϏāĻžāĻĢāĻžāϰāĻŋ auto-fills āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤

 

  • āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āωāχāĻ¨ā§āĻĄā§‹āϜ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āφāĻĒāύāĻŋ āωāχāĻ¨ā§āĻĄā§‹āĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻ—āĻŋāϟ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ—āĻŋāϟ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋāϝāĻŧāĻžāϞ āĻŽā§āϝāĻžāύ⧇āϜāĻžāϰ āĻĢāĻŋāϚāĻžāϰāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻŦāĻž āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŦāϤāĻ¨ā§āĻ¤ā§āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ°ā§āĻŦāĻļ⧇āώ GCM āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻāϟāĻŋ āωāĻĒāϰ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ “osxkeychain” helper āĻāϰ āĻŽāϤ⧋, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏ⧇āύāϏāĻŋāϟāĻŋāĻ­ āĻĄāĻžāϟāĻž āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ Windows Credential Store āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ WSL1 āĻŦāĻž WSL2-āĻ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻ“ āĻĒāϰāĻŋāĻŦ⧇āĻļāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ GCM āχāύāĻ¸ā§āϟāϞ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āĻĻ⧇āϖ⧁āύāĨ¤

 

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ—āĻŋāϟ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ­ā§āϝāĻžāϞ⧁ āϏ⧇āϟ āĻ•āϰ⧇ āĻāχ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ:

				
					$ git config --global credential.helper cache
				
			

āĻāχ helpers āϗ⧁āϞāĻŋāϰ āĻ•āĻŋāϛ⧁ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āφāϛ⧇. “store” helper āĻāĻ•āϟāĻŋ –file <path> āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻž āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰ⧇ āϝ⧇āĻ–āĻžāύ⧇ āĻĒā§āϞ⧇āχāύāĻŸā§‡āĻ•ā§āϏāϟ āĻĢāĻžāχāϞ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ (āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšāϞ ~/.git-credentials)āĨ¤ “cache” helper  –timeout <seconds> āĻ…āĻĒāĻļāύāϟāĻŋ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇, āϝāĻž āϤāĻžāϰ āĻĄā§‡āĻŽāύ(daemon) āϚāĻžāϞāĻžāύ⧋āϰ āϏāĻŽāϝāĻŧ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇ (āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻšāϞ “900”, āĻŦāĻž 15 āĻŽāĻŋāύāĻŋāϟ)āĨ¤ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻĢāĻžāχāϞ āύāĻžāĻŽā§‡āϰ āϏāĻžāĻĨ⧇ “store” helper āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻŦ⧇āύ āϤāĻžāϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻāĻ–āĻžāύ⧇ āϰāϝāĻŧ⧇āϛ⧇:

				
					$ git config --global credential.helper 'store --file ~/.my-credentials'

				
			

āĻ—āĻŋāϟ āĻāĻŽāύāĻ•āĻŋ āφāĻĒāύāĻžāϕ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ helper āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻšā§‹āĻ¸ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ  āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻ—āĻŋāϟ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāĻžāϰ⧇ āϜāĻŋāĻœā§āĻžāĻžāϏāĻž āĻ•āϰāĻŦ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāĻĨāĻŽ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻĨāĻžāĻŽāĻŦ⧇āĨ¤ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ  āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻ—āĻŋāϟ āϤāĻžāϞāĻŋāĻ•āĻžāϰ(List)  āϏāĻŽāĻ¸ā§āϤ helpers āϕ⧇ āχāωāϜāĻžāϰāύ⧇āĻŽ(username) āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ(password) āĻĒāĻžāĻ āĻžāĻŦ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰāĻž āϤāĻžāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āϕ⧀ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤āĻāĻ–āĻžāύ⧇ āφāĻĒāύāĻžāϰ āĻĨāĻžāĻŽā§āĻŦ āĻĄā§āϰāĻžāχāϭ⧇ āĻāĻ•āϟāĻŋ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻĢāĻžāχāĻ˛Â  āĻāĻ•āϟāĻŋ .gitconfig āĻĨāĻžāĻ•āĻŦ⧇ , āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĄā§āϰāĻžāχāĻ­āϟāĻŋ āĻĒā§āϞāĻžāĻ— āχāύ āύāĻž āĻĨāĻžāĻ•āϞ⧇ āĻ•āĻŋāϛ⧁ āϟāĻžāχāĻĒāĻŋāĻ‚ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϤ⧇ āχāύāĻŽā§‡āĻŽāϰāĻŋ āĻ•ā§āϝāĻžāĻļ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϚāĻžāύ āϏ⧇ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻāĻŽāύ āĻšāĻŦ⧇ :

				
					[credential]
    helper = store --file /mnt/thumbdrive/.git-credentials
    helper = cache --timeout 30000
				
			

āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻ•āĻŋāϛ⧁ āĻŦāĻŋāώ⧟:

āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāχ āϏāĻŦ āĻ•āĻžāϜ āĻ•āϰ⧇? āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋāϝāĻŧāĻžāϞāĻšā§‡āĻ˛ā§āĻĒāĻžāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻ—āĻŋāϟāĻāϰ āϰ⧁āϟ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻšāϞ āĻ—āĻŋāϟ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ, āϝāĻž āĻāĻ•āϟāĻŋ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āύ⧇āϝāĻŧ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ stdin āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāϰāĻ“ āχāύāĻĒ⧁āϟ āύ⧇āϝāĻŧāĨ¤

 

āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāϝāĻŧ⧇ āĻŦā§‹āĻāĻž āϏāĻšāϜ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϧāϰāĻž āϝāĻžāĻ• āϝ⧇ āĻāĻ•āϟāĻŋ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ helper āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āĻāĻŦāĻ‚ helper  mygithost āĻāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āϛ⧇āĨ¤ āĻāĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋ āϏ⧇āĻļāύ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž “fill” āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϝ⧇āϟāĻŋ āĻĄāĻžāĻ•āĻž(call) āĻšāϝāĻŧ āϝāĻ–āύ āĻ—āĻŋāϟ āĻāĻ•āϟāĻŋ āĻšā§‹āĻ¸ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇:



				
					$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost


Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7

				
			
  1. āĻāϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϞāĻžāχāύ āϝāĻž āχāĻ¨ā§āϟāĻžāϰ⧇āĻ•āĻļāύ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĨ¤

 

  1. Git-credential āϤāĻžāϰāĻĒāϰ stdin āĻ āχāύāĻĒ⧁āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāϛ⧇āĨ¤ āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϜāĻžāύāĻž āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻŋ: āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ āĻāĻŦāĻ‚ āĻšā§‹āĻ¸ā§āϟāύāĻžāĻŽāĨ¤

 

  1. āĻāĻ•āϟāĻŋ āĻĢāĻžāρāĻ•āĻž āϞāĻžāχāύ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝ⧇ āχāύāĻĒ⧁āϟ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϝāĻŧ⧇āϛ⧇, āĻāĻŦāĻ‚ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ āϝāĻž āĻāϟāĻŋ āϜāĻžāύ⧇āĨ¤

 

  1. Git-credential āϤāĻžāϰāĻĒāϰ āĻ­āĻžāϰ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇, āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϤāĻĨā§āϝ⧇āϰ āĻŦāĻŋāϟāϗ⧁āϞāĻŋ āĻĻāĻŋāϝāĻŧ⧇ stdout-āĻ āϞ⧇āϖ⧇āĨ¤

 

  1. āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āϖ⧁āρāĻœā§‡ āύāĻž āĻĒāĻžāĻ“āϝāĻŧāĻž āϗ⧇āϞ⧇, āĻ—āĻŋāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ(username) āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ(password) āϜāĻŋāĻœā§āĻžāĻžāϏāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āχāύāĻ­ā§‹āĻ•āĻŋāĻ‚ stdout āĻ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧ (āĻāĻ–āĻžāύ⧇ āϤāĻžāϰāĻž āĻāĻ•āχ āĻ•āύāϏ⧋āϞ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ)āĨ¤

 

āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āφāϏāϞ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āφāĻšā§āĻŦāĻžāύ āĻ•āϰāϛ⧇ āϝāĻž āĻ—āĻŋāϟ āĻĨ⧇āϕ⧇ āφāϞāĻžāĻĻāĻž; āϕ⧋āύāϟāĻŋ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ credential.helper āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŽāĻžāύ⧇āϰ āωāĻĒāϰāĨ¤ āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĢāĻ°ā§āĻŽ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇:

Configuration Value

Behavior

foo

Runs git-credential-foo

foo -a –opt=bcd

Runs git-credential-foo -a –opt=bcd

/absolute/path/foo -xyz

Runs /absolute/path/foo -xyz

!f() { echo “password=s3cre7”; }; f

Code after ! evaluated in shell

āϏ⧁āϤāϰāĻžāĻ‚ āωāĻĒāϰ⧇ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤Â  helper āĻĻ⧇āϰ āĻĒā§āϰāĻ•ā§ƒāϤāĻĒāĻ•ā§āώ⧇ git-credential-cache, git-credential-store āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āύāĻžāĻŽ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āϤāĻžāĻĻ⧇āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϞāĻžāχāύ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟ āύāĻŋāϤ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ āĻāϰ āϜāĻ¨ā§āϝ āϏāĻžāϧāĻžāϰāĻŖ āĻĢāĻ°ā§āĻŽ āĻšāϞ “git-credential-foo [args] <action>āĨ¤” stdin/stdout āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ git-credential āĻāϰ āĻŽāϤāχ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻžāϰāĻž āĻ•āĻžāĻœā§‡āĻ°Â  āĻāĻ•āϟāĻŋ āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻ­āĻŋāĻ¨ā§āύ āϏ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇:

 

  • get āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ(User) āύāĻžāĻŽ/āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻœā§‹āĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ requestāĨ¤

 

  • store āĻšāϞ āĻāχ helper’s āĻŽā§‡āĻŽāϰāĻŋāϤ⧇ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻāϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ requestāĨ¤

 

  • erase āĻĒā§āϰāĻĻāĻ¤ā§āϤ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāχ helper āĻŽā§‡āĻŽāϰāĻŋ āĻĨ⧇āϕ⧇ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āϜāĻ¨ā§āϝāĨ¤

 

āĻ¸ā§āĻŸā§‹āϰ āĻāĻŦāĻ‚ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ, āϕ⧋āύāĻ“ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ (āĻ—āĻŋāϟ āĻāϟāĻŋāϕ⧇ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰ⧇)āĨ¤ āϗ⧇āϟ āĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ, āϝāĻžāχāĻšā§‹āĻ•, āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀āϰ āĻ•āĻĨāĻžāϝāĻŧ āĻ—āĻŋāϟ āϖ⧁āĻŦāχ āφāĻ—ā§āϰāĻšā§€āĨ¤ āϝāĻĻāĻŋ āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀ āĻĻāϰāĻ•āĻžāϰ⧀ āĻ•āĻŋāϛ⧁ āύāĻž āϜāĻžāύ⧇, āϤāĻŦ⧇ āĻāϟāĻŋ āϕ⧋āύ āφāωāϟāĻĒ⧁āϟ āĻ›āĻžāĻĄāĻŧāĻžāχ āĻĒā§āϰāĻ¸ā§āĻĨāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝāĻĻāĻŋ āĻāϟāĻŋ āϜāĻžāύ⧇, āϤāĻŦ⧇ āĻāϟāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āϤāĻĨā§āϝ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻĻāĻ¤ā§āϤ āϤāĻĨā§āϝāϕ⧇ āĻŦāĻžāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϤ⧁āϞāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāωāϟāĻĒ⧁āϟāϕ⧇ āĻ…ā§āϝāĻžāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ āĻ¸ā§āĻŸā§‡āϟāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āĻŽāϤ⧋ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ; āĻĒā§āϰāĻĻāĻ¤ā§āϤ āĻ•āĻŋāϛ⧁ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻŦ⧇ āϝāĻž āĻ—āĻŋāϟ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āϜāĻžāύ⧇āĨ¤

 

āĻāĻ–āĻžāύ⧇ āωāĻĒāϰ⧇ āĻĨ⧇āϕ⧇ āĻāĻ•āχ āωāĻĻāĻžāĻšāϰāĻŖ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ—āĻŋāϟāĻĒā§āϰāĻŽāĻžāĻŖāĻĒāĻ¤ā§āϰ āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻž āĻāĻŦāĻ‚ āϏāϰāĻžāϏāϰāĻŋ āĻ—āĻŋāϟāĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋāϝāĻŧāĻžāϞāĻ¸ā§āĻŸā§‹āϰ⧇ āϝāĻžāĻ“āϝāĻŧāĻž:

				
					$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost


username=bob (3)
password=s3cre7

				
			
  1. āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āĻ•āĻŋāϛ⧁ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ git-credential-store āϕ⧇ āĻŦāϞāĻŋ: https://mygithost āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ(username) āύāĻžāĻŽ “bob” āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ “s3cre7” āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

 

  1. āĻāĻ–āύ āφāĻŽāϰāĻž āϏ⧇āχ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞāϗ⧁āϞāĻŋ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāĻŦāĨ¤ āφāĻŽāϰāĻž āϏāĻ‚āϝ⧋āϗ⧇āϰ āĻ…āĻ‚āĻļāϗ⧁āϞāĻŋ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāĻŋ āϝāĻž āφāĻŽāϰāĻž āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϜāĻžāύāĻŋ (https://mygithost), āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ–āĻžāϞāĻŋ āϞāĻžāχāύāĨ¤

 

  1. git-credential-store āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĒāϰ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻš āωāĻ¤ā§āϤāϰ āĻĻ⧇āϝāĻŧāĨ¤

 

~/git.store āĻĢāĻžāχāϞāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āϕ⧇āĻŽāύ āϤāĻž āĻāĻ–āĻžāύ⧇:

https://bob:s3cre7@mygithost

 

āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϞāĻžāχāύ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻŋāϰāĻŋāϜ, āϝāĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ credential-decorated URL āϰāϝāĻŧ⧇āϛ⧇āĨ¤ osxkeychain āĻāĻŦāĻ‚ wincred helper āϰāĻž āϤāĻžāĻĻ⧇āϰ āĻŦā§āϝāĻžāĻ•āĻŋāĻ‚ āĻ¸ā§āĻŸā§‹āϰ⧇āϰ āύ⧇āϟāĻŋāĻ­ āĻĢāϰāĻŽā§āϝāĻžāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϝāĻ–āύ āĻ•ā§āϝāĻžāĻļ⧇ āϤāĻžāϰ āύāĻŋāϜāĻ¸ā§āĻŦ āχāύāĻŽā§‡āĻŽāϰāĻŋ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ (āϝāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž)āĨ¤

  1. āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻ•ā§āϝāĻžāĻļ:

    git-credential-store āĻāĻŦāĻ‚ friends āĻ—āĻŋāϟ āĻĨ⧇āϕ⧇ āφāϞāĻžāĻĻāĻž āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ, āĻāϟāĻŋ āĻŦā§‹āĻāĻž āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āĻ•āĻŋāϛ⧁ āύāϝāĻŧ āϝ⧇, āϝ⧇āϕ⧋āύāĻ“ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻ•āϟāĻŋ āĻ—āĻŋāϟ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ helper āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ Git āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻĻāĻ¤ā§āϤ helper’āϰāĻž āĻ…āύ⧇āĻ• āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻ•āĻ­āĻžāϰ āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŦ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āύāϝāĻŧāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖ āĻ¸ā§āĻŦāϰ⧂āĻĒ, āϧāϰāĻž āϝāĻžāĻ• āφāĻĒāύāĻžāϰ āϟāĻŋāĻŽā§‡āϰ āĻ•āĻŋāϛ⧁ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻĒ⧁āϰ⧋ āĻĻāϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āϏāĻŽā§āĻ­āĻŦāϤ āĻĄā§‡āĻĒā§āϞ⧟āĻŽā§‡āĻ¨ā§āĻŸÂ  āĻāϰ āϜāĻ¨ā§āϝāĨ¤ āĻāϗ⧁āϞāĻŋ āĻāĻ•āϟāĻŋ āĻ­āĻžāĻ— āĻ•āϰāĻž āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ, āϤāĻŦ⧇ āφāĻĒāύāĻŋ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ āĻāϰ āϜāĻžā§ŸāĻ—āĻžā§Ÿ āϰāĻžāĻ–āϤ⧇ āϚāĻžāύ āύāĻž, āĻ•āĻžāϰāĻŖ āϏ⧇āϗ⧁āϞāĻŋ āĻĒā§āϰāĻžāϝāĻŧāĻļāχ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧ⧎ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āϕ⧋āύ⧋ helper āχ āĻāϟāĻŋ āĻ•āĻ­āĻžāϰ āĻ•āϰ⧇ āύāĻž; āĻĻ⧇āĻ–āĻž āϝāĻžāĻ• āφāĻŽāĻžāĻĻ⧇āϰ āύāĻŋāĻœā§‡āĻĻ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ•āϰāϤ⧇ āϕ⧀ āϞāĻžāĻ—āĻŦ⧇āĨ¤ āĻāχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻŽā§‚āϞ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻĨāĻžāĻ•āĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ:
    1. āφāĻŽāĻžāĻĻ⧇āϰ āĻŽāύ⧋āϝ⧋āĻ— āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ get; store āĻāĻŦāĻ‚ erase write āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻ, āϤāĻžāχ āϏ⧇āϗ⧁āϞāĻŋ āĻĒā§‡ā§Ÿā§‡ āϗ⧇āϞ⧇ āφāĻŽāϰāĻž āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰāĻ­āĻžāĻŦ⧇ āĻŦ⧇āϰ(exit) āĻšā§Ÿā§‡ āϝāĻžāĻŦ āĨ¤
    1. Shared-credential āĻĢāĻžāχāϞ⧇āϰ āĻĢāĻžāχāϞ āĻĢāϰāĻŽā§āϝāĻžāϟāϟāĻŋ git-credential-store āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻāĻ•āχ āϰāĻ•āĻŽāĨ¤
    1. āϏ⧇āχ āĻĢāĻžāχāϞ⧇āϰ location āϟāĻŋ āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋ āĻŽāĻžāύāϏāĻŽā§āĻŽāϤ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻžāĻĻ⧇āϰ āωāϚāĻŋāϤ āχāωāϜāĻžāϰāϕ⧇(User) āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻĒāĻžāĻĨ āĻĒāĻžāϏ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻžāĨ¤
    āφāĻŦāĻžāϰ, āφāĻŽāϰāĻž Ruby āϤ⧇ āĻāχ āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύāϟāĻŋ āϞāĻŋāĻ–āĻŦ, āϤāĻŦ⧇ āϝ⧇ āϕ⧋āύāĻ“ āĻ­āĻžāώāĻž āϤāϤāĻ•ā§āώāĻŖ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āϝāϤāĻ•ā§āώāĻŖ āĻ—āĻŋāϟ finished product āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ–āĻžāύ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āύāϤ⧁āύ āĻ•ā§āϰ⧇āĻĄā§‡āύāĻļāĻŋ⧟āĻžāϞ helper āĻāϰ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ āϰāϝāĻŧ⧇āϛ⧇:
				
					#!/usr/bin/env ruby


require 'optparse'


path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
    opts.banner = 'USAGE: git-credential-read-only [options] <action>'
    opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
        path = File.expand_path argpath
    end
end.parse!


exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exists? path


known = {} # (3)
while line = STDIN.gets
    break if line.strip == ''
    k,v = line.strip.split '=', 2
    known[k] = v
end


File.readlines(path).each do |fileline| # (4)
    prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
    if prot == known['protocol'] and host == known['host'] and user == known['username'] then
        puts "protocol=#{prot}"
        puts "host=#{host}"
        puts "username=#{user}"
        puts "password=#{pass}"
        exit(0)
    end
end

				
			
  1. āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϞāĻžāχāύ(command-line) āĻ…āĻĒāĻļāύ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻŋ, āϝāĻž āχāωāϜāĻžāϰāϕ⧇(User)  āχāύāĻĒ⧁āϟ āĻĢāĻžāχāϞāϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧāĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āϟ(default) āĻšāϞ ~/.git-credentialsāĨ¤

 

  1. āĻāχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āϤāĻ–āύāχ āϏāĻžāĻĄāĻŧāĻž āĻĻ⧇āϝāĻŧ āϝāĻĻāĻŋ  get āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻŦā§āϝāĻžāĻ•āĻŋāĻ‚āĻ¸ā§āĻŸā§‹āϰ(backing-store) āĻĢāĻžāχāϞāϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĨāĻžāϕ⧇āĨ¤

 

  1. āĻāχ āϞ⧁āĻĒ stdin āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻĨāĻŽ āĻĢāĻžāρāĻ•āĻž(new line) āϞāĻžāχāύ⧇ āύāĻž āĻĒ⧌āρāĻ›āĻžāύ⧋ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻĒāĻĄāĻŧ⧇āĨ¤ āχāύāĻĒ⧁āϟāϗ⧁āϞāĻŋ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ known āĻšā§āϝāĻžāĻļ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

 

  1. āĻāχ āϞ⧁āĻĒ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ, āĻĢāĻžāχāϞ⧇āϰ āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ read āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŽāĻŋāϞāĻžāύ⧋āϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇ āĨ¤ “known” āĻĨ⧇āϕ⧇ āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ, āĻšā§‹āĻ¸ā§āϟ āĻāĻŦāĻ‚ username āϝāĻĻāĻŋ āĻāχ āϞāĻžāχāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞ⧇ āϝāĻžā§Ÿ , āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻĢāϞāĻžāĻĢāϞāϗ⧁āϞāĻŋāϕ⧇(results) stdout āĻ āĻĒā§āϰāĻŋāĻ¨ā§āϟ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻĨ⧇āϕ⧇ āĻŦ⧇āϰ(exit) āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤Â 

 

āφāĻŽāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ helper āϕ⧇ git-credential-read-only āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻŦ, āĻāϟāĻŋāϕ⧇ āφāĻŽāĻžāĻĻ⧇āϰ PATH-āĻ āϕ⧋āĻĨāĻžāĻ“ āϰāĻžāĻ–āĻŦ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻŸā§‡āĻŦāϞ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻŦāĨ¤ āĻāĻ•āϟāĻŋ āχāĻ¨ā§āϟāĻžāϰ⧇āĻ•ā§āϟāĻŋāĻ­ āϏ⧇āĻļāύ āĻĻ⧇āĻ–āϤ⧇ āϕ⧇āĻŽāύ āϤāĻž āĻāĻ–āĻžāύ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ :

				
					$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
username=bob


protocol=https
host=mygithost
username=bob
password=s3cre7

				
			

āϝ⧇āĻšā§‡āϤ⧁ āĻāϟāĻŋāϰ āύāĻžāĻŽ “git-” āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ, āϤāĻžāχ āφāĻŽāϰāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŽāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāϧāĻžāϰāĻŖ āϏāĻŋāύāĻŸā§āϝāĻžāĻ•ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ:

				
					$ git config --global credential.helper 'read-only --file /mnt/shared/creds'

				
			

āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āĻāχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋ extend āĻ•āϰāĻž āĻŦ⧇āĻļ āϏāĻšāϜ, āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āĻĻāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āϏāĻžāϧāĻžāϰāĻŖ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤